The purpose of this exercise is to help familiarize you with some of the Geoprocessing Tools available in the various programs. These tools will help you to simplify, organize, and reduce the amount of information and allow you to create additional base maps from existing data.

1 The Introduction

The Federal Emergency Management Agency  (FEMA) is in the process of planning for the federal distribution of resources related to natural disasters in the US. As hurricane season approaches predictions are suggesting a very active season in the Atlantic Basin. As a FEMA analyst, you have been tasked with examining hurricane paths over the last five years that have impacted the Southeastern US. This information will be used to develop a plan for the establishment of temporary relief shelters, supply storage facilities, and mobile medical services that will be necessary in the hardest hit areas.

In this exercise you will:

  • Use various methods of geoprocessing
  • Create derived datasets
  • Adjust the coordinate systems
  • Create inset maps
  • Use the attribute table for labeling

Software specific directions can be found for each step below. Please submit the answer to the questions and your final map by the due date.

1.1 Step One: The Data

The data you will be using for this exercise comes from the National Oceanic and Atmospheric Administration - Office for Coastal Management, Historical Hurricane Tracks interactive map. Information on the site is derived from the NOAA National Hurricane Center HURDAT2 and NOAA National Centers for Environmental Information IBTrACS data sets.

View Directions in ArcGIS Pro

As you have done with each of the previous exercises, Exercise 2 and Exercise 3, you will begin by launching ArcGIS Pro from the start menu or dekstop shortcut. Select Map from New > Blank Templates and on the resulting screen provide a name and location for your project. Remember it would be beneficial to keep all of these exercises in a single folder on your computer.

With your screen now displaying the World Topographic Map  and World Hillshade  in the table of contents, navigate to GitHub and download all datasets for this exercise here to your project folder and extract the data. If you have any questions on how to retrieve and extract the data refer to Exercise 2, Step 1 for detailed instructions.

Add the states, counties, and all hurricanes  datasets to the map view. Remember that the layers in your Table of Contents  are drawn in the order they appear. So the first item on the list will be the first show, followed, by the second and so on. Therefore, if you want certain datasets to be visible above all others it should be located at the top by clicking and dragging the data up or down in the list. For polygons, you can edit the fill and transparency (found under the appearance tab in effects) to allow for items underneath to be scene. For example, in the image below, the hurricane tracts are ordered by year and are situated on top of the county and state polygons. If the polygons were drawn first, the hurricane tracts would not be shown once they make landfall. In this example, the states polygons are displayed with a hollow fill and white border to allow for the counties to show through with their black borders.

Ex4 Datasets

Refer back to previous exercises to review how to change the symbology for a given dataset. You should experiment with different order, fill, and transparencies to customize your view of the data.

Because FEMA is only interested in counties impacted by hurricanes, you need to select only the states that are intersected by the tracts. There are several ways to subset data in ArcGIS Pro. For this example we can select counties by name through a structured query language (SQL), we can use graphical tools to select data, and we can use geoprocessing tools to subset the data. Because this is a learning module, you will be learning several different techniques. While this might not necessarily be the quickest method, the purpose of this exercise is to introduce you to several tools you can use as appropriate in future projects.

To continue gathering data for this exercise you are first going to isolate the data you want to select. In the Table of Contents click the List by Selection button List by Selection to show a list of the selectable datasets in the project. Because you should have a number of datasets in the project, to isolate only the states file, right-click on the USA_States_Continental  and chose “Make this the only selectable layer”.

Make data selectable

To begin, click the drop-down menu for Select  on the Map Tab  and choose Lasso from the drop-down menu and and use the cursor to draw a circle encompassing Alabama, Arkansas, Delaware, Florida, Georgia, Illinois, Indiana, Kentucky, Louisiana, Maryland, Mississippi, Missouri, New Jersey, North Carolina, Ohio, Pennsylvania, South Carolina, Tennessee, Virginia, and West Virginia. Your circle does not need to include all of the state, just a small portion. See the example below:

Lasso Select Tool

With the states selected, return the Table of Contents to the “List by Drawing Order” button List by Drawing Order and right-click on the USA_States_Continental  dataset and choose Data > Export Features from the menu. In the resulting menu include the following options and click OK:

  • Input Features = USA_States_Continental
  • Output Location = Select a folder for the export. It it important that you do not click into the folder, simply click once to select and click OK (see example).
  • Output Name = choose a name for your file and add .shp behind it to create a shapefile.

Export Data

When finished you should have the file added to your project. Another technique to isolate data is by using the Clip analysis tool. This tool can be used to cut out a piece of one dataset using one or more of the features in another dataset as a “cookie cutter”. This is useful for creating a new dataset that contains a geographic subset of the features in another larger dataset.

ArcGIS Pro Clip Illustration

Illustration from https://pro.arcgis.com/en/pro-app/latest/tool-reference/analysis/clip.htm

Under the Analysis Tab, click the Tools button Geoprocessing Tools Button to open a geoprocessing search menu. In the search box at the top of the menu type in the word Clip and click enter. The first option will show “Clip (Analysis Tools)”. Click on the tool to open the associated menu. In the new menu choose the following options from the drop-down menus and click Run :

  • Input Features = USA_Counties
  • Clip Features = ex4_States (or the name of the file for the selected states in the previous step)
  • Output Feature Class = choose a name for your file and add .shp behind it to create a shapefile.

Clip Analysis Tool

This will create a dataset containing only the counties that are included within the states used as the selection. While the colors were altered to highlight the changes and additions to the project, you should now see a new dataset in your Table of Contents that only contains those counties.

Clipped Counties
Colors altered from previous images to highlight geoprocessing results.

Finally, while having the individual hurricane tracts can be important, for the purposes of this exercise you are going to use the Merge tool to combined all of the individual hurricane tracts into a single dataset. Similar to the previous step, click on the Tools  button on the Analysis Tab and search for Merge. Click on “Merge (Data Management Tool)” and in the new window choose the following options from the drop-down menu and click run:

  • Input Datasets = Either from the drop-down menu or the add many button  Add Many select all of the individual hurricane tracts. If using the “add many” button you will need to click the “add” link in the bottom right-hand corner of the input. If you use the drop-down menu the data will add automatically
  • Output Dataset = choose a name for your file and add .shp behind it to create a shapefile.

Merged Hurricanes

Now you can remove the USA_Counties  and all the individual hurricane tract files to reduce the clutter in your Table of Contents. To do this you simply right-click on the dataset in the Table of Contents and click Remove.

Question No. 1
How many individual tract segments are contained in the merged hurricane dataset?

View directions in QGIS

As you have done with each of the previous exercises, Exercise 2 and Exercise 3, you will begin by launching QGIS from the start menu, launchpad, or dekstop shortcut. Start with a New Empty Project  and save it to your project folder.

With your your empty project created, navigate to GitHub and download all datasets for this exercise here to your project folder and extract the data. If you have any questions on how to retrieve and extract the data refer to Exercise 2, Step 1 for detailed instructions.

Add the states, counties, and all hurricanes  datasets to the map view. Remember that the datasets in your Layers menu are drawn in the order they appear. So the first item on the list will be the first show, followed, by the second and so on. Therefore, if you want certain datasets to be visible above all others it should be located at the top by clicking and dragging the data up or down in the list. For polygons, you can edit the fill and transparency (found under the appearance tab in effects) to allow for items underneath to be scene. For example, in the image below, the hurricane tracts are ordered by year and are situated on top of the county and state polygons. If the polygons were drawn first, the hurricane tracts would not be shown once they make landfall. In this example, the states polygons are displayed with a hollow fill and white border to allow for the counties to show through with their black borders.

Exercise 4 Datasets

Refer back to previous exercises to review how to change the symbology for a given dataset. You should experiment with different order, fill, and transparencies to customize your view of the data.

Because FEMA is only interested in counties impacted by hurricanes, you need to select only the states that are intersected by the tracts. There are several ways to subset data in QGIS. For this example we can select counties by name through a structured query language (SQL), we can use graphical tools to select data, and we can use geoprocessing tools to subset the data. Because this is a learning module, you will be learning several different techniques. While this might not necessarily be the quickest method, the purpose of this exercise is to introduce you to several tools you can use as appropriate in future projects.

To continue gathering data for this exercise you are first going to isolate the data you want to select. Begin by clicking on the USA_States_Continental  dataset to make it the only selectable layer. Next, suing the Select Features tool Select Features Tool use the drop-down menu to choose Select Features by Freehand.

Freehand Select

Single click on the map somewhere in the Gulf of Mexico and use the cursor to draw a circle encompassing Alabama, Arkansas, Delaware, Florida, Georgia, Illinois, Indiana, Kentucky, Louisiana, Maryland, Mississippi, Missouri, New Jersey, North Carolina, Ohio, Pennsylvania, South Carolina, Tennessee, Virginia, and West Virginia. Your circle does not need to include all of the state, just a small portion. After circling the selected states, single click again to finish the selection. See the example below:

Data Selection

If you make a mistake you can use the Deselect Features button Clear Select Features Tool to clear your selection and try again. With the states selected, return the Layers menu right/CRTL click on the USA_States_Continental dataset and choose Export > Save Selected Features As… from the menu. In the resulting menu include the following options and click OK:

  • Format = ESRI Shapefile
  • File name = choose a name and location for your file by clicking on the Select Folder and File Name button
  • Leave all other options as the default

Export Data Selection

When finished you should have the file added to your project. Another technique to isolate data is by using the Clip analysis tool. This tool can be used to cut out a piece of one dataset using one or more of the features in another dataset as a “cookie cutter”. This is useful for creating a new dataset that contains a geographic subset of the features in another larger dataset.

ArcGIS Pro Clip Illustration

Illustration from https://pro.arcgis.com/en/pro-app/latest/tool-reference/analysis/clip.htm

On the menu bar, select Vector > Geoprocessing Tools > Clip to open the clipping dialog box. Choose the following options and click Run at the bottom of the screen when finished:

  • Input layer = USA_Counties
  • Overlay layer = The file of selected states you created above
  • Clipped = When creating new datasets you can choose to leave this section a Create temporoary layer or use the Select Folder and File Name button to choose Save to File…. Temporary layers are great when you need to create an intermediate layer you do not plan to retain for analysis. In this case, because we want to keep the file, it is best to save it as a new shapefile. Any temporary file created will be lost once you close the project.

Clip

This will create a dataset containing only the counties that are included within the states used as the selection. While the colors were altered to highlight the changes and additions to the project, you should now see the new dataset in your Layers menu that only contains those counties.

Clipped Data
Colors altered from previous images to highlight geoprocessing results.

Finally, while having the individual hurricane tracts can be important, for the purposes of this exercise you are going to use the Merge vector layers tool to combined all of the individual hurricane tracts into a single dataset. To locate this tool you will need to click the Toolbox  button Processing Toolbox Button on the toolbar. This will open the Processing Toolbox side menu and allow you to search for merge.

Double click on the Merge vector layers tool and in the new window click the Select Folder and File Name button for the Input layers. The window will shift to allow you to select all of the individual hurricane tract layers. When complete click the return arrow Select Folder and File Name to go back to the Merge Vector Layers dialog box. The Input layers  should now say “5 inputs selected.” Next, click the Select Folder and File Name button for the section that says Merged. While you could make this a temporary layer, it would be best to save the file similar to in the previous steps to retain access to the new dataset.

Merged Vector Layers Dialog

Now you can remove the USA_Counties  and all the individual hurricane tract files to reduce the clutter in your Layers menu. To do this you simply right/CRTL-click on the dataset in the Layers menu and click Remove Layer or hiding the layer by unchecking the hide layer  button Hide Layer Button.

Merged Data Example

Question No. 1
How many individual tract segments are contained in the merged hurricane dataset?

View directions in R

Before you begin, you will need to open the Ex2 Colab Notebook and insert tocolab after github in the URL to open in the Colab Environment. As you have seen before, R requires various packages to complete certain analyses. In this exercise you will be using tidyverse, OpenStreetMaps, ggfortify, maptools, and rgeos. To install and load the packages we will use the following script:

Blah…blah…blah…

Question No. 1
Insert Text Here

1.2 Step Two: The Analyses

In this step you will organize and display the data in order to prepare it for the final visualization.

View Directions in ArcGIS Pro

Now that you have the necessary data, you need determine which counties are most significantly impacted by the hurricanes. Because hurricane winds can impact areas far away from the eye or the storm, you will begin by creating a buffer around the hurricane tracts. You can either use the Tools button Geoprocessing Tools Button on the Analysis Tab  or search for Buffer in the list of tools next to the button. In the Buffer window select the following options and click run:

  • Input Features = The merged hurricane dataset
  • Output Feature Class = choose a name for your file and add .shp behind it to create a shapefile
  • Distance = 50 miles (linear unit)
  • Side Type = Full
  • End Type = Round
  • Method = Planar
  • Dissolve Type = Dissolve all output features into a single feature

Buffer Tool

If in this step or the next you encounter a warning stating there is a “datum conflict between the input and output”, just proceed with the exercise. We will discuss datums, a set of reference points on the earth’s surface against which position measurements are made, in future exercises. While they are important to understand, for the purposes of this exercise you can ignore the warning.

In this next step you need to isolate only the counties that are located within this buffer. To do this, click the Select By Location button Select By Location Button on the Map Tab  in the Selection Section. In the new menu choose the following and click OK.

  • Input Features = Your clipped counties
  • Relationship = Choose Intersect
  • Selecting Features = Your buffered hurricanes
  • Selection Type = New Selection

Select By Location

With this selection made, you can take the same steps as before to create a new dataset by right-clicking on the clipped counties dataset in the Table of Contents, going to Data > Export Features  and creating a new shapefile of the selected counties. You can now remove the clipped counties you created in step one or change the symbology to make this new selection stand out.

To answer the following question, open the attribute table for the new dataset you created highlighting the impacted counties. Right-click on the column header for the Population variable, and select statistics.

Question No. 2
What is the total population (sum information) of the counties impacted by these hurricanes?

View Directions in QGIS

Now that you have the necessary data, you need determine which counties are most significantly impacted by the hurricanes. Because hurricane winds can impact areas far away from the eye or the storm, you will begin by creating a buffer around the hurricane tracts. You can either go to Vector > Geoprocessing Tools > Buffer on the menu bar or search for Buffer in the Processing Toolbox  (similar to searching for Merge). Double-click on the Buffer tool, select the following options and click Run:

Buffer Tool Dialog

  • Input layer = The merged hurricane file you created
  • Distance = 0.8
  • Segments = 4
  • End cap style = Round
  • Join style = Round
  • Miter limit = 2.0
  • Check the box for Dissolve result
  • Buffered save the file in your project folder

You may receive a warning about using degrees to calculate the buffer. If so you can dismiss it for now. In future exercises you will project your dataset, however for the purposes of this exercise you can ignore the warning. Your screen should now look similar to this (colors have been altered to highlight the results):

Buffered hurricane dataset

For this exercise, you are going to add satellite imagery from a remote connection. In the browser, scroll down to XYZ Tiles and right/CRTL-click to add a “New Connection”. In the resulting window name the connection “Google Satellite” and type the following into the URL:

https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}

You can now click and drag Google Satellite into the layer to view the satellite imagery. Remember to arrange your layer so that either the fill for counties is transparent or the satellite layer is above the counties so you can see the imagery.

Adding satellite data basemap

In this next step you need to isolate only the counties that are located within the hurricane buffer. To do this, click Vector > Research Tools > Select By Location from the menu bar. In the new menu choose the following and click Run

Select by location tool

  • Select features from = The clipped counties dataset. This is the file that contains only the counties in the selected states.
  • Where the features (geometric predicate) = Check the box for intersect
  • By comparing to the features from = The hurricane buffer dataset
  • Modify current selection by = Creating new selection

With this selection made, you can take the same steps as before to create a new dataset by right/CRTL-clicking on the clipped counties dataset in the Layers menu, going to Export > Save Selected Features As… and creating a new shapefile of the selected counties.

Exporting the current selection

You can now remove the clipped counties you created in step one or change the symbology to make this new selection stand out.

All Analyzed Datasets

To answer the following question, click the Show Statistical Summary  button Show Statistical Summary Button on the menu bar. A new menu will open in the left-hand column of the screen. In this menu select the dataset you created for the hurricane impacted counties in the first box and population in the second.

Statistics Information

Question No. 2
What is the total population (sum information) of the counties impacted by these hurricanes?

View Directions in R

Blah…blah…blah…

Question No. 2
Insert Text Here

1.3 Step Three: The Visualization

You will now create a graphical display of your data that includes cartographic elements such as legend, scale bar, north arrow, etc. In this visualization you will also learn to add a different basemap, add an inset or overview map, and alter the projected coordinate system.

View directions in ArcGIS Pro

On the Map Tab  click the Basemap button Basemaps and select the option for Oceans. Remember that the order of the datasets in the Table of Contets determines what order they are displayed.

Basemaps

In future exercises you may choose any of these basemap options that are apprropriate for your analyses. Next, on the Insert Tab  click the button for New Map Insert New Map and select New Map. A new map tab (probably called Map2) will appear in your map frame. Add (or copy/paste from the original map) the hurricane impacted counties and the continental US States shapefiles as well as the Oceans basemap to this new map. Be sure to zoom in a appropriate to see the data.

Inset Map

To return to the original map simply click on the appropriate tab. This will allow you to switch back and forth between the two in order to make the necessary customizations. It may be beneficial to rename each one to keep track of the purpose for each map.

Next you can change the projection of the coordinate system for the inset map (Map2). In the Table of Contents, right-click on Map2 and select Properties. In the resulting window click Coordinate Systems from the left-side menu. Under “XY Coordinate Systems Available” scroll down until you see Projected Coordinate System. Using the series of drop-down menus go to Projected Coordinate System > Continental > North America and select the option for “North America Albers Equal Area Conic” and click OK. You should notice that the awkward “flat top” border of the United States should now me curved and the overall shape of the states has a more pleasing appearance.

Altering Coordinate systems

In lecture we will discuss the importance of projections and coordinate systems. In future exercises you should take some time to select different options to see which Coordinate System  has the most pleasing shape to your eyes.

It is now time for you to make your map. Similar to previous exercises, you need to add all of the necessary elements discussed in Exercise 2 and 3. In this exercise you will also need to add your inset map (Map2). To do this, you first need to add the primary map with using the Map Frame button like before. Next you can click the Map Frame button again to add the second map.

Add Inset Map

However, for the inset you want it to be smaller and not cover your map data.

Map with Inset Map

Finalize your map by adding all of the necessary map elements (title, legend, north arrow, scale bar, name and date) and altering the symbology of the hurricane dataset to provide additional important data. Remember to renaming items in the Table of Contents will rename them in the legend.

Final Map

Question No. 3
How many total impacted counties are included in the new dataset?

View directions in QGIS

To create this visualization you are going to also create what is called an inset or indicator map. These are smaller maps that are used to provide additional detail about a specific location. These maps are often small scale versions or the primary map, but sometimes can be larger scale to enhance detail in congested areas. In this case it will be a small scale version of the continental US.

To begin this process you are going to create some organizations in the Layer Menu by using the Add Group button Add Groups. Name the first group “Main Map” and create a second group called “Inset Map”.

Layers Groups

In the Layers Menu you can click and drag the datasets into the different groups as well as right/CRTL-click to copy and paste. For this exercise you should order your datasets as follows:

  • Main Map
    • Hurricanes Dataset
    • Hurricane Impacted Counties
    • Selected States
    • Clipped Counties
    • Continental US
    • Google Satellite Imagery
  • Inset Map
    • Hurricane Buffer
    • Selected States
    • Continental US
    • Google Satellite Imagery

Layers Groups

Similar to previous exercises, your visualization should include all of the necessary map elements discussed in Exercise 2 and 3. However, you will also need to add the inset map for this exercise. To do this, you first need to create a New Print Layout, and with the “Main Map” selected and the “Inset Map” hidden in the Layers Menu, and add the map with the Add map  tool like before.

Layout with Main Map

In the item properties for the map, set your level of zoom and align the map in your desired location. Then under Layers  section, click “Lock Layers” to keep the map frame from being altered. You can always return to this layer and unlock it if you need to make changes.

Next return to the project and turn off the Main Map, then turn on the Inset Map and return to the layout and add another map. Because you have the inset group selected and the main map group hidden, the additional map frame will contain the inset information. Remember to think about where you want the inset to be located before you draw it on the layout. While you can change this at anytime, you should always have a planned map design.

Layout with Inset Map

Finalize your map by adding all of the necessary map elements (title, legend, north arrow, scale bar, name and date) and altering the symbology of the hurricane dataset to provide additional important data. Remember to renaming items in the Table of Contents will rename them in the legend but you will need to update in the item properties. Alternatively, in the item properties for the legend you can select any object and click the Edit button Add Groups to rename them.

Question No. 3
How many total impacted counties are included in the new dataset?

View directions in R

Blah…blah…blah…

Question No. 3
Insert Text Here

1.4 Step Four: Your Turn

After providing the initial map to FEMA, the Deputy Associate Administrator for the Office of Response and Recovery has asked if you could add some additional data. Specifically, they are interested in cities with a population of greater than 300,000 so they are able to situate response teams in proximity to the most people.

View directions in ArcGIS Pro

If you did not previously download the cities data from the GitHub Exercise Page please download the data and unzip it in your project folder. With that data available, add the US_Cities_100k.shp to your primary map (not the inset map). Repeating the steps to clip from Step 1 select the cities as your Input Feature, the hurricane buffer as the Clip Feature, and be sure to save the new dataset to your project folder with .shp to create a shapefile. You can now remove the US Cities from the project but keep your clipped cities.

While you will leave all of the clipped cities on the map, you will now create a Label Class to only create labels for cities with a population greater than 300,000. To begin, right-click on your new clipped cities dataset and select “Labeling Properties…” Labeling Properties from the options.

Under the “Class” option in the Label Class window select SQL from the three options. Next select New expression  Labeling SQL and select the following options:

Where POPULATIONis greater than300,000

SQL Options for Labeling

When complete, click Apply at the bottom of the window. Use the options on the Labeling Tab for the dataset to adjust the label field to NAME, change the font or size of the text, and click the Label button on the left of the tab.

Labeling Options

Question No. 4
What labeled cities are the furthest North, South, East, and West?

View directions in QGIS

If you did not previously download the cities data from the GitHub Exercise Page please download the data and unzip it in your project folder. With that data available, add the US_Cities_100k.shp to your primary map (not the inset map). Repeating the steps to clip from Step 1 select the cities as your Input Layer, the hurricane buffer as the Overlay Layer, and be sure to save the new dataset to your project folder in the Clipped  option. You can now remove the US Cities from the project but keep your clipped cities.

While you will leave all of the clipped cities on the map, you will now create a Label Class to only create labels for cities with a population greater than 300,000. To begin, right/CRTL-click on your new clipped cities dataset and select “Properties”. Under the Labels tab on the left side of the new window, select Rule-based Labeling  from the drop-down menu at the top of the window. Next, click the Green + at the bottom to add a new rule. Provide the following inputs and click OK

  • Description = Give your rule a name
  • Filter = Type the following: "POPULATION" > 300000
  • Labels = Check this box
  • Value = NAME
  • Text, Formatting, Buffer, Mask, etc. = Customize as necessary for your preferred style

Rule-based Options for Labeling

Finally, click OK on the layer properties window. You will need to return to your main map in the layout and uncheck the box for locked to update the map with this new information.

Question No. 4
What labeled cities are the furthest North, South, East, and West?

View directions in R

Blah…blah…blah…

Question No. 4
Insert Text Here

2 The Write-Up

In the report you provide to FEMA please provide the following information:

  • Total population of the impacted counties
  • Total number of large cities (all in the clipped dataset)
  • Which cities above 300,000 people would need response teams
    • Based on the distribution of these, would it be possible for one response team to cover multiple large cities?

When complete, send a link to your Colab Notebook or word document with answers to Questions 1-4 and your completed map via email.

LS0tDQp0aXRsZTogIkV4ZXJjaXNlIDQ6IEJhc2ljIEdlb3Byb2Nlc3NpbmcgVG9vbHMgPGJyPjxzbWFsbD5HZW9ncmFwaGljIEluZm9ybWF0aW9uIFN5c3RlbXMgMSBMYWI8L3NtYWxsPjwvYnI+Ig0KYXV0aG9yOiAiR0VPRyAzMTUwIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHJvd3MucHJpbnQ6IDEwDQogICAgdGhlbWU6IGNvc21vDQogICAgaGlnaGxpZ2h0OiBicmVlemVkYXJrDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogbm8NCiAgICAgIHNtb290aF9zY3JvbGw6IHllcw0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIGRmX3ByaW50OiBwYWdlZA0KZWRpdG9yX29wdGlvbnM6DQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCiAgbW9kZTogZ2ZtDQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KaDEudGl0bGUgew0KICBmb250LXNpemU6IDQwcHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMjBweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQouem9vbSB7DQogIHRyYW5zZm9ybS1vcmlnaW46IDQwJSA1MCUgMDsNCiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIC4yczsNCiAgbWFyZ2luOiAwIGF1dG87DQp9DQouem9vbSBpbWd7DQoJd2lkdGg6YXV0bzsNCgloZWlnaHQ6YXV0bzsJDQp9DQouem9vbTpob3ZlciB7DQogIHRyYW5zZm9ybTogc2NhbGUoMik7DQp9DQoNCnRoLCB0ZCB7cGFkZGluZzogNXB4O30NCg0KPC9zdHlsZT4NCmBgYA0KPGhyPjwvaHI+DQoNClRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gaGVscCBmYW1pbGlhcml6ZSB5b3Ugd2l0aCBzb21lIG9mIHRoZSBHZW9wcm9jZXNzaW5nIFRvb2xzIGF2YWlsYWJsZSBpbiB0aGUgdmFyaW91cyBwcm9ncmFtcy4gVGhlc2UgdG9vbHMgd2lsbCBoZWxwIHlvdSB0byBzaW1wbGlmeSwgb3JnYW5pemUsIGFuZCByZWR1Y2UgdGhlIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBhbmQgYWxsb3cgeW91IHRvIGNyZWF0ZSBhZGRpdGlvbmFsIGJhc2UgbWFwcyBmcm9tIGV4aXN0aW5nIGRhdGEuDQoNCiMgVGhlIEludHJvZHVjdGlvbg0KDQpUaGUgX0ZlZGVyYWwgRW1lcmdlbmN5IE1hbmFnZW1lbnQgQWdlbmN5XyZuYnNwOyAoRkVNQSkgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgcGxhbm5pbmcgZm9yIHRoZSBmZWRlcmFsIGRpc3RyaWJ1dGlvbiBvZiByZXNvdXJjZXMgcmVsYXRlZCB0byBuYXR1cmFsIGRpc2FzdGVycyBpbiB0aGUgVVMuIEFzIFtodXJyaWNhbmVdKGh0dHBzOi8vd3d3Lm5vYWEuZ292L25ld3MtcmVsZWFzZS9ub2FhLXByZWRpY3RzLWFub3RoZXItYWN0aXZlLWF0bGFudGljLWh1cnJpY2FuZS1zZWFzb24pIHNlYXNvbiBhcHByb2FjaGVzIHByZWRpY3Rpb25zIGFyZSBzdWdnZXN0aW5nIGEgdmVyeSBhY3RpdmUgc2Vhc29uIGluIHRoZSBBdGxhbnRpYyBCYXNpbi4gQXMgYSBGRU1BIGFuYWx5c3QsIHlvdSBoYXZlIGJlZW4gdGFza2VkIHdpdGggZXhhbWluaW5nIGh1cnJpY2FuZSBwYXRocyBvdmVyIHRoZSBsYXN0IGZpdmUgeWVhcnMgdGhhdCBoYXZlIGltcGFjdGVkIHRoZSBTb3V0aGVhc3Rlcm4gVVMuIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIHRvIGRldmVsb3AgYSBwbGFuIGZvciB0aGUgZXN0YWJsaXNobWVudCBvZiB0ZW1wb3JhcnkgcmVsaWVmIHNoZWx0ZXJzLCBzdXBwbHkgc3RvcmFnZSBmYWNpbGl0aWVzLCBhbmQgbW9iaWxlIG1lZGljYWwgc2VydmljZXMgdGhhdCB3aWxsIGJlIG5lY2Vzc2FyeSBpbiB0aGUgaGFyZGVzdCBoaXQgYXJlYXMuDQoNCkluIHRoaXMgZXhlcmNpc2UgeW91IHdpbGw6DQoNCi0gICBVc2UgdmFyaW91cyBtZXRob2RzIG9mIGdlb3Byb2Nlc3NpbmcNCi0gICBDcmVhdGUgZGVyaXZlZCBkYXRhc2V0cw0KLSAgIEFkanVzdCB0aGUgY29vcmRpbmF0ZSBzeXN0ZW1zDQotICAgQ3JlYXRlIGluc2V0IG1hcHMNCi0gICBVc2UgdGhlIGF0dHJpYnV0ZSB0YWJsZSBmb3IgbGFiZWxpbmcNCg0KU29mdHdhcmUgc3BlY2lmaWMgZGlyZWN0aW9ucyBjYW4gYmUgZm91bmQgZm9yIGVhY2ggc3RlcCBiZWxvdy4gUGxlYXNlIHN1Ym1pdCB0aGUgYW5zd2VyIHRvIHRoZSBxdWVzdGlvbnMgYW5kIHlvdXIgZmluYWwgbWFwIGJ5IHRoZSBkdWUgZGF0ZS4NCg0KIyMgU3RlcCBPbmU6IFRoZSBEYXRhDQoNClRoZSBkYXRhIHlvdSB3aWxsIGJlIHVzaW5nIGZvciB0aGlzIGV4ZXJjaXNlIGNvbWVzIGZyb20gdGhlIE5hdGlvbmFsIE9jZWFuaWMgYW5kIEF0bW9zcGhlcmljIEFkbWluaXN0cmF0aW9uIC0gW09mZmljZSBmb3IgQ29hc3RhbCBNYW5hZ2VtZW50XShodHRwczovL2NvYXN0Lm5vYWEuZ292LyksIFtIaXN0b3JpY2FsIEh1cnJpY2FuZSBUcmFja3MgaW50ZXJhY3RpdmUgbWFwXShodHRwczovL2NvYXN0Lm5vYWEuZ292L2h1cnJpY2FuZXMvKS4gSW5mb3JtYXRpb24gb24gdGhlIHNpdGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBOT0FBIE5hdGlvbmFsIEh1cnJpY2FuZSBDZW50ZXIgW0hVUkRBVDJdKGh0dHBzOi8vd3d3Lm5oYy5ub2FhLmdvdi9kYXRhLyNodXJkYXQpIGFuZCBOT0FBIE5hdGlvbmFsIENlbnRlcnMgZm9yIEVudmlyb25tZW50YWwgSW5mb3JtYXRpb24gW0lCVHJBQ1NdKGh0dHBzOi8vd3d3Lm5jZGMubm9hYS5nb3YvaWJ0cmFjcy8pIGRhdGEgc2V0cy4NCg0KPGRldGFpbHM+DQo8c3VtbWFyeT48YmlnPlZpZXcgRGlyZWN0aW9ucyBpbiA8Yj4gW0FyY0dJUyBQcm9de3N0eWxlPSJjb2xvcjojZmY0NTAwIn0gPC9iPjwvYmlnPjwvc3VtbWFyeT4NCg0KQXMgeW91IGhhdmUgZG9uZSB3aXRoIGVhY2ggb2YgdGhlIHByZXZpb3VzIGV4ZXJjaXNlcywgW0V4ZXJjaXNlIDJdKGh0dHBzOi8vY2hyaXNtZ2VudHJ5LmdpdGh1Yi5pby9HSVMxLUV4ZXJjaXNlLTIvKSBhbmQgW0V4ZXJjaXNlIDNdKGh0dHBzOi8vY2hyaXNtZ2VudHJ5LmdpdGh1Yi5pby9HSVMxLUV4ZXJjaXNlLTMvKSwgeW91IHdpbGwgYmVnaW4gYnkgbGF1bmNoaW5nICoqW0FyY0dJUyBQcm9de3N0eWxlPSJjb2xvcjojZmY0NTAwIn0qKiBmcm9tIHRoZSBzdGFydCBtZW51IG9yIGRla3N0b3Agc2hvcnRjdXQuIFNlbGVjdCAqKk1hcCoqIGZyb20gX05ldyA+IEJsYW5rIFRlbXBsYXRlc18gYW5kIG9uIHRoZSByZXN1bHRpbmcgc2NyZWVuIHByb3ZpZGUgYSBuYW1lIGFuZCBsb2NhdGlvbiBmb3IgeW91ciBwcm9qZWN0LiBSZW1lbWJlciBpdCB3b3VsZCBiZSBiZW5lZmljaWFsIHRvIGtlZXAgYWxsIG9mIHRoZXNlIGV4ZXJjaXNlcyBpbiBhIHNpbmdsZSBmb2xkZXIgb24geW91ciBjb21wdXRlci4gDQoNCldpdGggeW91ciBzY3JlZW4gbm93IGRpc3BsYXlpbmcgdGhlIF9Xb3JsZCBUb3BvZ3JhcGhpYyBNYXBfJm5ic3A7IGFuZCBfV29ybGQgSGlsbHNoYWRlXyZuYnNwOyBpbiB0aGUgdGFibGUgb2YgY29udGVudHMsIG5hdmlnYXRlIHRvIEdpdEh1YiBhbmQgZG93bmxvYWQgKipbYWxsIGRhdGFzZXRzIGZvciB0aGlzIGV4ZXJjaXNlIGhlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc21nZW50cnkvR0lTMS1FeGVyY2lzZS00L3RyZWUvbWFpbi9EYXRhKSoqIHRvIHlvdXIgcHJvamVjdCBmb2xkZXIgYW5kIGV4dHJhY3QgdGhlIGRhdGEuIElmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgb24gaG93IHRvIHJldHJpZXZlIGFuZCBleHRyYWN0IHRoZSBkYXRhIHJlZmVyIHRvIFtFeGVyY2lzZSAyLCBTdGVwIDFdKGh0dHBzOi8vY2hyaXNtZ2VudHJ5LmdpdGh1Yi5pby9HSVMxLUV4ZXJjaXNlLTIvIzExX1N0ZXBfT25lOl9UaGVfRGF0YSkgZm9yIGRldGFpbGVkIGluc3RydWN0aW9ucy4NCg0KQWRkIHRoZSBfc3RhdGVzXywgX2NvdW50aWVzXywgYW5kIGFsbCBfaHVycmljYW5lc18mbmJzcDsgZGF0YXNldHMgdG8gdGhlIG1hcCB2aWV3LiBSZW1lbWJlciB0aGF0IHRoZSBsYXllcnMgaW4geW91ciBfVGFibGUgb2YgQ29udGVudHNfJm5ic3A7IGFyZSBkcmF3biBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIuIFNvIHRoZSBmaXJzdCBpdGVtIG9uIHRoZSBsaXN0IHdpbGwgYmUgdGhlIGZpcnN0IHNob3csIGZvbGxvd2VkLCBieSB0aGUgc2Vjb25kIGFuZCBzbyBvbi4gVGhlcmVmb3JlLCBpZiB5b3Ugd2FudCBjZXJ0YWluIGRhdGFzZXRzIHRvIGJlIHZpc2libGUgYWJvdmUgYWxsIG90aGVycyBpdCBzaG91bGQgYmUgbG9jYXRlZCBhdCB0aGUgdG9wIGJ5IGNsaWNraW5nIGFuZCBkcmFnZ2luZyB0aGUgZGF0YSB1cCBvciBkb3duIGluIHRoZSBsaXN0LiBGb3IgcG9seWdvbnMsIHlvdSBjYW4gZWRpdCB0aGUgZmlsbCBhbmQgdHJhbnNwYXJlbmN5IChmb3VuZCB1bmRlciB0aGUgYXBwZWFyYW5jZSB0YWIgaW4gZWZmZWN0cykgdG8gYWxsb3cgZm9yIGl0ZW1zIHVuZGVybmVhdGggdG8gYmUgc2NlbmUuIEZvciBleGFtcGxlLCBpbiB0aGUgaW1hZ2UgYmVsb3csIHRoZSBodXJyaWNhbmUgdHJhY3RzIGFyZSBvcmRlcmVkIGJ5IHllYXIgYW5kIGFyZSBzaXR1YXRlZCBvbiB0b3Agb2YgdGhlIGNvdW50eSBhbmQgc3RhdGUgcG9seWdvbnMuIElmIHRoZSBwb2x5Z29ucyB3ZXJlIGRyYXduIGZpcnN0LCB0aGUgaHVycmljYW5lIHRyYWN0cyB3b3VsZCBub3QgYmUgc2hvd24gb25jZSB0aGV5IG1ha2UgbGFuZGZhbGwuIEluIHRoaXMgZXhhbXBsZSwgdGhlIHN0YXRlcyBwb2x5Z29ucyBhcmUgZGlzcGxheWVkIHdpdGggYSBob2xsb3cgZmlsbCBhbmQgd2hpdGUgYm9yZGVyIHRvIGFsbG93IGZvciB0aGUgY291bnRpZXMgdG8gc2hvdyB0aHJvdWdoIHdpdGggdGhlaXIgYmxhY2sgYm9yZGVycy4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvYXJjZ2lzLWV4NC1kYXRhLmpwZyIgYWx0PSJFeDQgRGF0YXNldHMiIHN0eWxlPSJ3aWR0aDoxMDAlIj48L2Rpdj48L3A+DQoNClJlZmVyIGJhY2sgdG8gcHJldmlvdXMgZXhlcmNpc2VzIHRvIHJldmlldyBob3cgdG8gY2hhbmdlIHRoZSBzeW1ib2xvZ3kgZm9yIGEgZ2l2ZW4gZGF0YXNldC4gWW91IHNob3VsZCBleHBlcmltZW50IHdpdGggZGlmZmVyZW50IG9yZGVyLCBmaWxsLCBhbmQgdHJhbnNwYXJlbmNpZXMgdG8gY3VzdG9taXplIHlvdXIgdmlldyBvZiB0aGUgZGF0YS4NCg0KQmVjYXVzZSBGRU1BIGlzIG9ubHkgaW50ZXJlc3RlZCBpbiBjb3VudGllcyBpbXBhY3RlZCBieSBodXJyaWNhbmVzLCB5b3UgbmVlZCB0byBzZWxlY3Qgb25seSB0aGUgc3RhdGVzIHRoYXQgYXJlIGludGVyc2VjdGVkIGJ5IHRoZSB0cmFjdHMuIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdG8gc3Vic2V0IGRhdGEgaW4gW0FyY0dJUyBQcm9de3N0eWxlPSJjb2xvcjojZmY0NTAwIn0uIEZvciB0aGlzIGV4YW1wbGUgd2UgY2FuIHNlbGVjdCBjb3VudGllcyBieSBuYW1lIHRocm91Z2ggYSBzdHJ1Y3R1cmVkIHF1ZXJ5IGxhbmd1YWdlIChTUUwpLCB3ZSBjYW4gdXNlIGdyYXBoaWNhbCB0b29scyB0byBzZWxlY3QgZGF0YSwgYW5kIHdlIGNhbiB1c2UgZ2VvcHJvY2Vzc2luZyB0b29scyB0byBzdWJzZXQgdGhlIGRhdGEuIEJlY2F1c2UgdGhpcyBpcyBhIGxlYXJuaW5nIG1vZHVsZSwgeW91IHdpbGwgYmUgbGVhcm5pbmcgc2V2ZXJhbCBkaWZmZXJlbnQgdGVjaG5pcXVlcy4gV2hpbGUgdGhpcyBtaWdodCBub3QgbmVjZXNzYXJpbHkgYmUgdGhlIHF1aWNrZXN0IG1ldGhvZCwgdGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBpbnRyb2R1Y2UgeW91IHRvIHNldmVyYWwgdG9vbHMgeW91IGNhbiB1c2UgYXMgYXBwcm9wcmlhdGUgaW4gZnV0dXJlIHByb2plY3RzLiANCg0KVG8gY29udGludWUgZ2F0aGVyaW5nIGRhdGEgZm9yIHRoaXMgZXhlcmNpc2UgeW91IGFyZSBmaXJzdCBnb2luZyB0byBpc29sYXRlIHRoZSBkYXRhIHlvdSB3YW50IHRvIHNlbGVjdC4gSW4gdGhlIF9UYWJsZSBvZiBDb250ZW50c18gY2xpY2sgdGhlICoqTGlzdCBieSBTZWxlY3Rpb24qKiBidXR0b24gPGltZyBzcmM9ICJJbWFnZXMvYXJjZ2lzLWxpc3Qtc2VsZWN0aW9uLWJ1dHRvbi5qcGciIGFsdD0iTGlzdCBieSBTZWxlY3Rpb24iIHdpZHRoID0gIjIwIiBoZWlnaHQgPSAiMjAiPiB0byBzaG93IGEgbGlzdCBvZiB0aGUgc2VsZWN0YWJsZSBkYXRhc2V0cyBpbiB0aGUgcHJvamVjdC4gQmVjYXVzZSB5b3Ugc2hvdWxkIGhhdmUgYSBudW1iZXIgb2YgZGF0YXNldHMgaW4gdGhlIHByb2plY3QsIHRvIGlzb2xhdGUgb25seSB0aGUgc3RhdGVzIGZpbGUsIHJpZ2h0LWNsaWNrIG9uIHRoZSBfVVNBX1N0YXRlc19Db250aW5lbnRhbF8mbmJzcDsgYW5kIGNob3NlICJNYWtlIHRoaXMgdGhlIG9ubHkgc2VsZWN0YWJsZSBsYXllciIuIA0KDQo8cCBhbGlnbj0iY2VudGVyIj48ZGl2IGNsYXNzPSJ6b29tIj48aW1nIHNyYz0gIkltYWdlcy9hcmNnaXMtbWFrZS1zZWxlY3RhYmxlLnBuZyIgYWx0PSJNYWtlIGRhdGEgc2VsZWN0YWJsZSIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KVG8gYmVnaW4sIGNsaWNrIHRoZSBkcm9wLWRvd24gbWVudSBmb3IgX1NlbGVjdF8mbmJzcDsgb24gdGhlIF9NYXAgVGFiXyZuYnNwOyBhbmQgY2hvb3NlICoqTGFzc28qKiBmcm9tIHRoZSBkcm9wLWRvd24gbWVudSBhbmQgYW5kIHVzZSB0aGUgY3Vyc29yIHRvIGRyYXcgYSBjaXJjbGUgZW5jb21wYXNzaW5nIEFsYWJhbWEsIEFya2Fuc2FzLCBEZWxhd2FyZSwgRmxvcmlkYSwgR2VvcmdpYSwgSWxsaW5vaXMsIEluZGlhbmEsIEtlbnR1Y2t5LCBMb3Vpc2lhbmEsIE1hcnlsYW5kLCBNaXNzaXNzaXBwaSwgTWlzc291cmksIE5ldyBKZXJzZXksIE5vcnRoIENhcm9saW5hLCBPaGlvLCBQZW5uc3lsdmFuaWEsIFNvdXRoIENhcm9saW5hLCBUZW5uZXNzZWUsIFZpcmdpbmlhLCBhbmQgV2VzdCBWaXJnaW5pYS4gWW91ciBjaXJjbGUgZG9lcyBub3QgbmVlZCB0byBpbmNsdWRlIGFsbCBvZiB0aGUgc3RhdGUsIGp1c3QgYSBzbWFsbCBwb3J0aW9uLiBTZWUgdGhlIGV4YW1wbGUgYmVsb3c6DQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy1sYXNzby1zZWxlY3QucG5nIiBhbHQ9Ikxhc3NvIFNlbGVjdCBUb29sIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9kaXY+PC9wPg0KDQpXaXRoIHRoZSBzdGF0ZXMgc2VsZWN0ZWQsIHJldHVybiB0aGUgVGFibGUgb2YgQ29udGVudHMgdG8gdGhlICJMaXN0IGJ5IERyYXdpbmcgT3JkZXIiIGJ1dHRvbiA8aW1nIHNyYz0gIkltYWdlcy9hcmNnaXMtbGlzdC1kcmF3LWJ1dHRvbi5qcGciIGFsdD0iTGlzdCBieSBEcmF3aW5nIE9yZGVyIiB3aWR0aCA9ICIyMCIgaGVpZ2h0ID0gIjIwIj4gYW5kIHJpZ2h0LWNsaWNrIG9uIHRoZSBfVVNBX1N0YXRlc19Db250aW5lbnRhbF8mbmJzcDsgZGF0YXNldCBhbmQgY2hvb3NlICoqRGF0YSA+IEV4cG9ydCBGZWF0dXJlcyoqIGZyb20gdGhlIG1lbnUuIEluIHRoZSByZXN1bHRpbmcgbWVudSBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhbmQgY2xpY2sgT0s6DQoNCi0gX0lucHV0IEZlYXR1cmVzXyA9IFVTQV9TdGF0ZXNfQ29udGluZW50YWwNCi0gX091dHB1dCBMb2NhdGlvbl8gPSBTZWxlY3QgYSBmb2xkZXIgZm9yIHRoZSBleHBvcnQuIEl0IGl0IGltcG9ydGFudCB0aGF0IHlvdSBkbyBub3QgY2xpY2sgaW50byB0aGUgZm9sZGVyLCBzaW1wbHkgY2xpY2sgb25jZSB0byBzZWxlY3QgYW5kIGNsaWNrIE9LIChzZWUgZXhhbXBsZSkuDQotIF9PdXRwdXQgTmFtZV8gPSBjaG9vc2UgYSBuYW1lIGZvciB5b3VyIGZpbGUgYW5kIGFkZCAuc2hwIGJlaGluZCBpdCB0byBjcmVhdGUgYSBzaGFwZWZpbGUuDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy1leHBvcnQtZGF0YS5wbmciIGFsdD0iRXhwb3J0IERhdGEiIHN0eWxlPSJ3aWR0aDoxMDAlIj48L2Rpdj48L3A+DQoNCldoZW4gZmluaXNoZWQgeW91IHNob3VsZCBoYXZlIHRoZSBmaWxlIGFkZGVkIHRvIHlvdXIgcHJvamVjdC4gQW5vdGhlciB0ZWNobmlxdWUgdG8gaXNvbGF0ZSBkYXRhIGlzIGJ5IHVzaW5nIHRoZSAqKkNsaXAqKiBhbmFseXNpcyB0b29sLiBUaGlzIHRvb2wgY2FuIGJlIHVzZWQgdG8gY3V0IG91dCBhIHBpZWNlIG9mIG9uZSBkYXRhc2V0IHVzaW5nIG9uZSBvciBtb3JlIG9mIHRoZSBmZWF0dXJlcyBpbiBhbm90aGVyIGRhdGFzZXQgYXMgYSAiY29va2llIGN1dHRlciIuIFRoaXMgaXMgdXNlZnVsIGZvciBjcmVhdGluZyBhIG5ldyBkYXRhc2V0IHRoYXQgY29udGFpbnMgYSBnZW9ncmFwaGljIHN1YnNldCBvZiB0aGUgZmVhdHVyZXMgaW4gYW5vdGhlciBsYXJnZXIgZGF0YXNldC4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9ICJJbWFnZXMvYXJjZ2lzLWNsaXAtaWxsdXN0cmF0aW9uLnBuZyIgYWx0PSJBcmNHSVMgUHJvIENsaXAgSWxsdXN0cmF0aW9uIiB3aWR0aD0iNTE1IiBoZWlnaHQ9IjIwMiI+PGZpZ2NhcHRpb24+PHNtYWxsPjxiPklsbHVzdHJhdGlvbiBmcm9tIGh0dHBzOi8vcHJvLmFyY2dpcy5jb20vZW4vcHJvLWFwcC9sYXRlc3QvdG9vbC1yZWZlcmVuY2UvYW5hbHlzaXMvY2xpcC5odG08L2I+PC9zbWFsbD48L2ZpZ2NhcHRpb24+PC9wPg0KDQpVbmRlciB0aGUgX0FuYWx5c2lzIFRhYl8sIGNsaWNrIHRoZSAqKlRvb2xzKiogYnV0dG9uIDxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy10b29sYm94LWJ1dHRvbi5qcGciIGFsdD0iR2VvcHJvY2Vzc2luZyBUb29scyBCdXR0b24iIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCI+IHRvIG9wZW4gYSBnZW9wcm9jZXNzaW5nIHNlYXJjaCBtZW51LiBJbiB0aGUgc2VhcmNoIGJveCBhdCB0aGUgdG9wIG9mIHRoZSBtZW51IHR5cGUgaW4gdGhlIHdvcmQgKipDbGlwKiogYW5kIGNsaWNrIGVudGVyLiBUaGUgZmlyc3Qgb3B0aW9uIHdpbGwgc2hvdyAiKipDbGlwKiogKEFuYWx5c2lzIFRvb2xzKSIuIENsaWNrIG9uIHRoZSB0b29sIHRvIG9wZW4gdGhlIGFzc29jaWF0ZWQgbWVudS4gSW4gdGhlIG5ldyBtZW51IGNob29zZSB0aGUgZm9sbG93aW5nIG9wdGlvbnMgZnJvbSB0aGUgZHJvcC1kb3duIG1lbnVzIGFuZCBjbGljayBSdW4gOg0KDQotIF9JbnB1dCBGZWF0dXJlc18gPSBVU0FfQ291bnRpZXMNCi0gX0NsaXAgRmVhdHVyZXNfID0gZXg0X1N0YXRlcyAob3IgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZm9yIHRoZSBzZWxlY3RlZCBzdGF0ZXMgaW4gdGhlIHByZXZpb3VzIHN0ZXApDQotIF9PdXRwdXQgRmVhdHVyZSBDbGFzc18gPSBjaG9vc2UgYSBuYW1lIGZvciB5b3VyIGZpbGUgYW5kIGFkZCAuc2hwIGJlaGluZCBpdCB0byBjcmVhdGUgYSBzaGFwZWZpbGUuDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy1jbGlwLXRvb2wucG5nIiBhbHQ9IkNsaXAgQW5hbHlzaXMgVG9vbCIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KVGhpcyB3aWxsIGNyZWF0ZSBhIGRhdGFzZXQgY29udGFpbmluZyBvbmx5IHRoZSBjb3VudGllcyB0aGF0IGFyZSBpbmNsdWRlZCB3aXRoaW4gdGhlIHN0YXRlcyB1c2VkIGFzIHRoZSBzZWxlY3Rpb24uIFdoaWxlIHRoZSBjb2xvcnMgd2VyZSBhbHRlcmVkIHRvIGhpZ2hsaWdodCB0aGUgY2hhbmdlcyBhbmQgYWRkaXRpb25zIHRvIHRoZSBwcm9qZWN0LCB5b3Ugc2hvdWxkIG5vdyBzZWUgYSBuZXcgZGF0YXNldCBpbiB5b3VyIFRhYmxlIG9mIENvbnRlbnRzIHRoYXQgb25seSBjb250YWlucyB0aG9zZSBjb3VudGllcy4gDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy1jbGlwcGVkLWRhdGEucG5nIiBhbHQ9IkNsaXBwZWQgQ291bnRpZXMiIHN0eWxlPSJ3aWR0aDoxMDAlIj48L2Rpdj48ZmlnY2FwdGlvbj48c21hbGw+PGI+Q29sb3JzIGFsdGVyZWQgZnJvbSBwcmV2aW91cyBpbWFnZXMgdG8gaGlnaGxpZ2h0IGdlb3Byb2Nlc3NpbmcgcmVzdWx0cy48L2I+PC9zbWFsbD48L2ZpZ2NhcHRpb24+PC9wPg0KDQpGaW5hbGx5LCB3aGlsZSBoYXZpbmcgdGhlIGluZGl2aWR1YWwgaHVycmljYW5lIHRyYWN0cyBjYW4gYmUgaW1wb3J0YW50LCBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZXhlcmNpc2UgeW91IGFyZSBnb2luZyB0byB1c2UgdGhlICoqTWVyZ2UqKiB0b29sIHRvIGNvbWJpbmVkIGFsbCBvZiB0aGUgaW5kaXZpZHVhbCBodXJyaWNhbmUgdHJhY3RzIGludG8gYSBzaW5nbGUgZGF0YXNldC4gU2ltaWxhciB0byB0aGUgcHJldmlvdXMgc3RlcCwgY2xpY2sgb24gdGhlIF9Ub29sc18mbmJzcDsgYnV0dG9uIG9uIHRoZSBBbmFseXNpcyBUYWIgYW5kIHNlYXJjaCBmb3IgKipNZXJnZSoqLiBDbGljayBvbiAiKipNZXJnZSoqIChEYXRhIE1hbmFnZW1lbnQgVG9vbCkiIGFuZCBpbiB0aGUgbmV3IHdpbmRvdyBjaG9vc2UgdGhlIGZvbGxvd2luZyBvcHRpb25zIGZyb20gdGhlIGRyb3AtZG93biBtZW51IGFuZCBjbGljayBydW46DQoNCi0gX0lucHV0IERhdGFzZXRzXyA9IEVpdGhlciBmcm9tIHRoZSBkcm9wLWRvd24gbWVudSBvciB0aGUgX2FkZCBtYW55IGJ1dHRvbl8mbmJzcDsgPGltZyBzcmM9ICJJbWFnZXMvYXJjZ2lzLWFkZC1tYW55LWJ1dHRvbi5qcGciIGFsdD0iQWRkIE1hbnkiIHdpZHRoID0gIjEwIiBoZWlnaHQgPSAiMTAiPiBzZWxlY3QgYWxsIG9mIHRoZSBpbmRpdmlkdWFsIGh1cnJpY2FuZSB0cmFjdHMuIElmIHVzaW5nIHRoZSAiYWRkIG1hbnkiIGJ1dHRvbiB5b3Ugd2lsbCBuZWVkIHRvIGNsaWNrIHRoZSAiYWRkIiBsaW5rIGluIHRoZSBib3R0b20gcmlnaHQtaGFuZCBjb3JuZXIgb2YgdGhlIGlucHV0LiBJZiB5b3UgdXNlIHRoZSBkcm9wLWRvd24gbWVudSB0aGUgZGF0YSB3aWxsIGFkZCBhdXRvbWF0aWNhbGx5DQotIF9PdXRwdXQgRGF0YXNldF8gPSBjaG9vc2UgYSBuYW1lIGZvciB5b3VyIGZpbGUgYW5kIGFkZCAuc2hwIGJlaGluZCBpdCB0byBjcmVhdGUgYSBzaGFwZWZpbGUuDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy1tZXJnZWQtZGF0YS5wbmciIGFsdD0iTWVyZ2VkIEh1cnJpY2FuZXMiIHN0eWxlPSJ3aWR0aDoxMDAlIj48L2Rpdj48L3A+DQoNCk5vdyB5b3UgY2FuIHJlbW92ZSB0aGUgX1VTQV9Db3VudGllc18mbmJzcDsgYW5kIGFsbCB0aGUgaW5kaXZpZHVhbCBodXJyaWNhbmUgdHJhY3QgZmlsZXMgdG8gcmVkdWNlIHRoZSBjbHV0dGVyIGluIHlvdXIgVGFibGUgb2YgQ29udGVudHMuIFRvIGRvIHRoaXMgeW91IHNpbXBseSByaWdodC1jbGljayBvbiB0aGUgZGF0YXNldCBpbiB0aGUgVGFibGUgb2YgQ29udGVudHMgYW5kIGNsaWNrIF9SZW1vdmVfLg0KDQo8YmlnPjxiPlF1ZXN0aW9uIE5vLiAxPC9iPjwvYmlnPg0KPGJsb2NrcXVvdGU+DQpIb3cgbWFueSBpbmRpdmlkdWFsIHRyYWN0IHNlZ21lbnRzIGFyZSBjb250YWluZWQgaW4gdGhlIG1lcmdlZCBodXJyaWNhbmUgZGF0YXNldD8NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KPGhyPjwvaHI+DQoNCjxkZXRhaWxzPg0KPHN1bW1hcnk+PGJpZz5WaWV3IGRpcmVjdGlvbnMgaW4gPGI+IFtRR0lTXXtzdHlsZT0iY29sb3I6ICMwMDY0MDAifSA8L2I+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpBcyB5b3UgaGF2ZSBkb25lIHdpdGggZWFjaCBvZiB0aGUgcHJldmlvdXMgZXhlcmNpc2VzLCBbRXhlcmNpc2UgMl0oaHR0cHM6Ly9jaHJpc21nZW50cnkuZ2l0aHViLmlvL0dJUzEtRXhlcmNpc2UtMi8pIGFuZCBbRXhlcmNpc2UgM10oaHR0cHM6Ly9jaHJpc21nZW50cnkuZ2l0aHViLmlvL0dJUzEtRXhlcmNpc2UtMy8pLCB5b3Ugd2lsbCBiZWdpbiBieSBsYXVuY2hpbmcgPGI+W1FHSVNde3N0eWxlPSJjb2xvcjogIzAwNjQwMCJ9PC9iPiBmcm9tIHRoZSBzdGFydCBtZW51LCBsYXVuY2hwYWQsIG9yIGRla3N0b3Agc2hvcnRjdXQuIFN0YXJ0IHdpdGggYSBfTmV3IEVtcHR5IFByb2plY3RfJm5ic3A7IGFuZCBzYXZlIGl0IHRvIHlvdXIgcHJvamVjdCBmb2xkZXIuIA0KDQpXaXRoIHlvdXIgeW91ciBlbXB0eSBwcm9qZWN0IGNyZWF0ZWQsIG5hdmlnYXRlIHRvIEdpdEh1YiBhbmQgZG93bmxvYWQgKipbYWxsIGRhdGFzZXRzIGZvciB0aGlzIGV4ZXJjaXNlIGhlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc21nZW50cnkvR0lTMS1FeGVyY2lzZS00L3RyZWUvbWFpbi9EYXRhKSoqIHRvIHlvdXIgcHJvamVjdCBmb2xkZXIgYW5kIGV4dHJhY3QgdGhlIGRhdGEuIElmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgb24gaG93IHRvIHJldHJpZXZlIGFuZCBleHRyYWN0IHRoZSBkYXRhIHJlZmVyIHRvIFtFeGVyY2lzZSAyLCBTdGVwIDFdKGh0dHBzOi8vY2hyaXNtZ2VudHJ5LmdpdGh1Yi5pby9HSVMxLUV4ZXJjaXNlLTIvIzExX1N0ZXBfT25lOl9UaGVfRGF0YSkgZm9yIGRldGFpbGVkIGluc3RydWN0aW9ucy4NCg0KQWRkIHRoZSBfc3RhdGVzXywgX2NvdW50aWVzXywgYW5kIGFsbCBfaHVycmljYW5lc18mbmJzcDsgZGF0YXNldHMgdG8gdGhlIG1hcCB2aWV3LiBSZW1lbWJlciB0aGF0IHRoZSBkYXRhc2V0cyBpbiB5b3VyIF9MYXllcnNfJm5ic3A7bWVudSBhcmUgZHJhd24gaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyLiBTbyB0aGUgZmlyc3QgaXRlbSBvbiB0aGUgbGlzdCB3aWxsIGJlIHRoZSBmaXJzdCBzaG93LCBmb2xsb3dlZCwgYnkgdGhlIHNlY29uZCBhbmQgc28gb24uIFRoZXJlZm9yZSwgaWYgeW91IHdhbnQgY2VydGFpbiBkYXRhc2V0cyB0byBiZSB2aXNpYmxlIGFib3ZlIGFsbCBvdGhlcnMgaXQgc2hvdWxkIGJlIGxvY2F0ZWQgYXQgdGhlIHRvcCBieSBjbGlja2luZyBhbmQgZHJhZ2dpbmcgdGhlIGRhdGEgdXAgb3IgZG93biBpbiB0aGUgbGlzdC4gRm9yIHBvbHlnb25zLCB5b3UgY2FuIGVkaXQgdGhlIGZpbGwgYW5kIHRyYW5zcGFyZW5jeSAoZm91bmQgdW5kZXIgdGhlIGFwcGVhcmFuY2UgdGFiIGluIGVmZmVjdHMpIHRvIGFsbG93IGZvciBpdGVtcyB1bmRlcm5lYXRoIHRvIGJlIHNjZW5lLiBGb3IgZXhhbXBsZSwgaW4gdGhlIGltYWdlIGJlbG93LCB0aGUgaHVycmljYW5lIHRyYWN0cyBhcmUgb3JkZXJlZCBieSB5ZWFyIGFuZCBhcmUgc2l0dWF0ZWQgb24gdG9wIG9mIHRoZSBjb3VudHkgYW5kIHN0YXRlIHBvbHlnb25zLiBJZiB0aGUgcG9seWdvbnMgd2VyZSBkcmF3biBmaXJzdCwgdGhlIGh1cnJpY2FuZSB0cmFjdHMgd291bGQgbm90IGJlIHNob3duIG9uY2UgdGhleSBtYWtlIGxhbmRmYWxsLiBJbiB0aGlzIGV4YW1wbGUsIHRoZSBzdGF0ZXMgcG9seWdvbnMgYXJlIGRpc3BsYXllZCB3aXRoIGEgaG9sbG93IGZpbGwgYW5kIHdoaXRlIGJvcmRlciB0byBhbGxvdyBmb3IgdGhlIGNvdW50aWVzIHRvIHNob3cgdGhyb3VnaCB3aXRoIHRoZWlyIGJsYWNrIGJvcmRlcnMuDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL3FnaXMtZXg0LWRhdGEucG5nIiBhbHQ9IkV4ZXJjaXNlIDQgRGF0YXNldHMiIHN0eWxlPSJ3aWR0aDoxMDAlIj48L2Rpdj48L3A+DQoNClJlZmVyIGJhY2sgdG8gcHJldmlvdXMgZXhlcmNpc2VzIHRvIHJldmlldyBob3cgdG8gY2hhbmdlIHRoZSBzeW1ib2xvZ3kgZm9yIGEgZ2l2ZW4gZGF0YXNldC4gWW91IHNob3VsZCBleHBlcmltZW50IHdpdGggZGlmZmVyZW50IG9yZGVyLCBmaWxsLCBhbmQgdHJhbnNwYXJlbmNpZXMgdG8gY3VzdG9taXplIHlvdXIgdmlldyBvZiB0aGUgZGF0YS4NCg0KQmVjYXVzZSBGRU1BIGlzIG9ubHkgaW50ZXJlc3RlZCBpbiBjb3VudGllcyBpbXBhY3RlZCBieSBodXJyaWNhbmVzLCB5b3UgbmVlZCB0byBzZWxlY3Qgb25seSB0aGUgc3RhdGVzIHRoYXQgYXJlIGludGVyc2VjdGVkIGJ5IHRoZSB0cmFjdHMuIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdG8gc3Vic2V0IGRhdGEgaW4gW1FHSVNde3N0eWxlPSJjb2xvcjogIzAwNjQwMCJ9LiBGb3IgdGhpcyBleGFtcGxlIHdlIGNhbiBzZWxlY3QgY291bnRpZXMgYnkgbmFtZSB0aHJvdWdoIGEgc3RydWN0dXJlZCBxdWVyeSBsYW5ndWFnZSAoU1FMKSwgd2UgY2FuIHVzZSBncmFwaGljYWwgdG9vbHMgdG8gc2VsZWN0IGRhdGEsIGFuZCB3ZSBjYW4gdXNlIGdlb3Byb2Nlc3NpbmcgdG9vbHMgdG8gc3Vic2V0IHRoZSBkYXRhLiBCZWNhdXNlIHRoaXMgaXMgYSBsZWFybmluZyBtb2R1bGUsIHlvdSB3aWxsIGJlIGxlYXJuaW5nIHNldmVyYWwgZGlmZmVyZW50IHRlY2huaXF1ZXMuIFdoaWxlIHRoaXMgbWlnaHQgbm90IG5lY2Vzc2FyaWx5IGJlIHRoZSBxdWlja2VzdCBtZXRob2QsIHRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gaW50cm9kdWNlIHlvdSB0byBzZXZlcmFsIHRvb2xzIHlvdSBjYW4gdXNlIGFzIGFwcHJvcHJpYXRlIGluIGZ1dHVyZSBwcm9qZWN0cy4NCg0KVG8gY29udGludWUgZ2F0aGVyaW5nIGRhdGEgZm9yIHRoaXMgZXhlcmNpc2UgeW91IGFyZSBmaXJzdCBnb2luZyB0byBpc29sYXRlIHRoZSBkYXRhIHlvdSB3YW50IHRvIHNlbGVjdC4gQmVnaW4gYnkgY2xpY2tpbmcgb24gdGhlIF9VU0FfU3RhdGVzX0NvbnRpbmVudGFsXyZuYnNwOyBkYXRhc2V0IHRvIG1ha2UgaXQgdGhlIG9ubHkgc2VsZWN0YWJsZSBsYXllci4gTmV4dCwgc3VpbmcgdGhlICoqU2VsZWN0IEZlYXR1cmVzICoqIHRvb2wgPGltZyBzcmM9ICJJbWFnZXMvcWdpcy1zZWxlY3QtZmVhdHVyZXMtdG9vbC5qcGciIGFsdD0iU2VsZWN0IEZlYXR1cmVzIFRvb2wiIHdpZHRoID0gIjIwIiBoZWlnaHQgPSAiMjAiPiB1c2UgdGhlIGRyb3AtZG93biBtZW51IHRvIGNob29zZSAqKlNlbGVjdCBGZWF0dXJlcyBieSBGcmVlaGFuZCoqLg0KDQo8cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0gIkltYWdlcy9xZ2lzLWZyZWVoYW5kLXNlbGVjdC10b29sLmpwZyIgYWx0PSJGcmVlaGFuZCBTZWxlY3QiIHN0eWxlPSJ3aWR0aDo1MCUiPjwvcD4NCg0KU2luZ2xlIGNsaWNrIG9uIHRoZSBtYXAgc29tZXdoZXJlIGluIHRoZSBHdWxmIG9mIE1leGljbyBhbmQgdXNlIHRoZSBjdXJzb3IgdG8gZHJhdyBhIGNpcmNsZSBlbmNvbXBhc3NpbmcgQWxhYmFtYSwgQXJrYW5zYXMsIERlbGF3YXJlLCBGbG9yaWRhLCBHZW9yZ2lhLCBJbGxpbm9pcywgSW5kaWFuYSwgS2VudHVja3ksIExvdWlzaWFuYSwgTWFyeWxhbmQsIE1pc3Npc3NpcHBpLCBNaXNzb3VyaSwgTmV3IEplcnNleSwgTm9ydGggQ2Fyb2xpbmEsIE9oaW8sIFBlbm5zeWx2YW5pYSwgU291dGggQ2Fyb2xpbmEsIFRlbm5lc3NlZSwgVmlyZ2luaWEsIGFuZCBXZXN0IFZpcmdpbmlhLiBZb3VyIGNpcmNsZSBkb2VzIG5vdCBuZWVkIHRvIGluY2x1ZGUgYWxsIG9mIHRoZSBzdGF0ZSwganVzdCBhIHNtYWxsIHBvcnRpb24uIEFmdGVyIGNpcmNsaW5nIHRoZSBzZWxlY3RlZCBzdGF0ZXMsIHNpbmdsZSBjbGljayBhZ2FpbiB0byBmaW5pc2ggdGhlIHNlbGVjdGlvbi4gU2VlIHRoZSBleGFtcGxlIGJlbG93Og0KDQo8cCBhbGlnbj0iY2VudGVyIj48ZGl2IGNsYXNzPSJ6b29tIj48aW1nIHNyYz0gIkltYWdlcy9xZ2lzLWRhdGEtc2VsZWN0aW9uLXRvb2wucG5nIiBhbHQ9IkRhdGEgU2VsZWN0aW9uIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9kaXY+PC9wPg0KDQpJZiB5b3UgbWFrZSBhIG1pc3Rha2UgeW91IGNhbiB1c2UgdGhlIF9EZXNlbGVjdCBGZWF0dXJlc18gYnV0dG9uIDxpbWcgc3JjPSAiSW1hZ2VzL3FnaXMtY2xlYXItc2VsZWN0aW9uLWJ1dHRvbi5wbmciIGFsdD0iQ2xlYXIgU2VsZWN0IEZlYXR1cmVzIFRvb2wiIHdpZHRoID0gIjIwIiBoZWlnaHQgPSAiMjAiPiB0byBjbGVhciB5b3VyIHNlbGVjdGlvbiBhbmQgdHJ5IGFnYWluLiBXaXRoIHRoZSBzdGF0ZXMgc2VsZWN0ZWQsIHJldHVybiB0aGUgTGF5ZXJzIG1lbnUgcmlnaHQvQ1JUTCBjbGljayBvbiB0aGUgVVNBX1N0YXRlc19Db250aW5lbnRhbCBkYXRhc2V0IGFuZCBjaG9vc2UgKipFeHBvcnQgPiBTYXZlIFNlbGVjdGVkIEZlYXR1cmVzIEFzLi4uKiogZnJvbSB0aGUgbWVudS4gSW4gdGhlIHJlc3VsdGluZyBtZW51IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBvcHRpb25zIGFuZCBjbGljayBPSzoNCg0KLSBfRm9ybWF0XyA9IEVTUkkgU2hhcGVmaWxlDQotIF9GaWxlIG5hbWVfID0gY2hvb3NlIGEgbmFtZSBhbmQgbG9jYXRpb24gZm9yIHlvdXIgZmlsZSBieSBjbGlja2luZyBvbiB0aGUgPGltZyBzcmM9ICJJbWFnZXMvcWdpcy1mb2xkZXItc2VsZWN0LWJ1dHRvbi5qcGciIGFsdD0iU2VsZWN0IEZvbGRlciBhbmQgRmlsZSBOYW1lIiB3aWR0aCA9ICIyMCIgaGVpZ2h0ID0gIjIwIj4gYnV0dG9uDQotIExlYXZlIGFsbCBvdGhlciBvcHRpb25zIGFzIHRoZSBkZWZhdWx0DQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL3FnaXMtZXhwb3J0LXNlbGVjdGlvbi5wbmciIGFsdD0iRXhwb3J0IERhdGEgU2VsZWN0aW9uIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9kaXY+PC9wPg0KDQpXaGVuIGZpbmlzaGVkIHlvdSBzaG91bGQgaGF2ZSB0aGUgZmlsZSBhZGRlZCB0byB5b3VyIHByb2plY3QuIEFub3RoZXIgdGVjaG5pcXVlIHRvIGlzb2xhdGUgZGF0YSBpcyBieSB1c2luZyB0aGUgKipDbGlwKiogYW5hbHlzaXMgdG9vbC4gVGhpcyB0b29sIGNhbiBiZSB1c2VkIHRvIGN1dCBvdXQgYSBwaWVjZSBvZiBvbmUgZGF0YXNldCB1c2luZyBvbmUgb3IgbW9yZSBvZiB0aGUgZmVhdHVyZXMgaW4gYW5vdGhlciBkYXRhc2V0IGFzIGEgImNvb2tpZSBjdXR0ZXIiLiBUaGlzIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgYSBuZXcgZGF0YXNldCB0aGF0IGNvbnRhaW5zIGEgZ2VvZ3JhcGhpYyBzdWJzZXQgb2YgdGhlIGZlYXR1cmVzIGluIGFub3RoZXIgbGFyZ2VyIGRhdGFzZXQuDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy1jbGlwLWlsbHVzdHJhdGlvbi5wbmciIGFsdD0iQXJjR0lTIFBybyBDbGlwIElsbHVzdHJhdGlvbiIgd2lkdGg9IjUxNSIgaGVpZ2h0PSIyMDIiPjxmaWdjYXB0aW9uPjxzbWFsbD48Yj5JbGx1c3RyYXRpb24gZnJvbSBodHRwczovL3Byby5hcmNnaXMuY29tL2VuL3Byby1hcHAvbGF0ZXN0L3Rvb2wtcmVmZXJlbmNlL2FuYWx5c2lzL2NsaXAuaHRtPC9iPjwvc21hbGw+PC9maWdjYXB0aW9uPjwvcD4NCg0KT24gdGhlIG1lbnUgYmFyLCBzZWxlY3QgKipWZWN0b3IgPiBHZW9wcm9jZXNzaW5nIFRvb2xzID4gQ2xpcCoqIHRvIG9wZW4gdGhlIGNsaXBwaW5nIGRpYWxvZyBib3guIENob29zZSB0aGUgZm9sbG93aW5nIG9wdGlvbnMgYW5kIGNsaWNrIFJ1biBhdCB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gd2hlbiBmaW5pc2hlZDoNCg0KLSBfSW5wdXQgbGF5ZXJfID0gVVNBX0NvdW50aWVzDQotIF9PdmVybGF5IGxheWVyXyA9IFRoZSBmaWxlIG9mIHNlbGVjdGVkIHN0YXRlcyB5b3UgY3JlYXRlZCBhYm92ZQ0KLSBfQ2xpcHBlZF8gPSBXaGVuIGNyZWF0aW5nIG5ldyBkYXRhc2V0cyB5b3UgY2FuIGNob29zZSB0byBsZWF2ZSB0aGlzIHNlY3Rpb24gYSBfQ3JlYXRlIHRlbXBvcm9hcnkgbGF5ZXJfIG9yIHVzZSB0aGUgPGltZyBzcmM9ICJJbWFnZXMvcWdpcy1mb2xkZXItc2VsZWN0LWJ1dHRvbi5qcGciIGFsdD0iU2VsZWN0IEZvbGRlciBhbmQgRmlsZSBOYW1lIiB3aWR0aCA9ICIyMCIgaGVpZ2h0ID0gIjIwIj4gYnV0dG9uIHRvIGNob29zZSBfU2F2ZSB0byBGaWxlLi4uXy4gVGVtcG9yYXJ5IGxheWVycyBhcmUgZ3JlYXQgd2hlbiB5b3UgbmVlZCB0byBjcmVhdGUgYW4gaW50ZXJtZWRpYXRlIGxheWVyIHlvdSBkbyBub3QgcGxhbiB0byByZXRhaW4gZm9yIGFuYWx5c2lzLiBJbiB0aGlzIGNhc2UsIGJlY2F1c2Ugd2Ugd2FudCB0byBrZWVwIHRoZSBmaWxlLCBpdCBpcyBiZXN0IHRvIHNhdmUgaXQgYXMgYSBuZXcgc2hhcGVmaWxlLiBBbnkgdGVtcG9yYXJ5IGZpbGUgY3JlYXRlZCB3aWxsIGJlIGxvc3Qgb25jZSB5b3UgY2xvc2UgdGhlIHByb2plY3QuDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL3FnaXMtY2xpcC10b29sLnBuZyIgYWx0PSJDbGlwIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9kaXY+PC9wPg0KDQpUaGlzIHdpbGwgY3JlYXRlIGEgZGF0YXNldCBjb250YWluaW5nIG9ubHkgdGhlIGNvdW50aWVzIHRoYXQgYXJlIGluY2x1ZGVkIHdpdGhpbiB0aGUgc3RhdGVzIHVzZWQgYXMgdGhlIHNlbGVjdGlvbi4gV2hpbGUgdGhlIGNvbG9ycyB3ZXJlIGFsdGVyZWQgdG8gaGlnaGxpZ2h0IHRoZSBjaGFuZ2VzIGFuZCBhZGRpdGlvbnMgdG8gdGhlIHByb2plY3QsIHlvdSBzaG91bGQgbm93IHNlZSB0aGUgbmV3IGRhdGFzZXQgaW4geW91ciBMYXllcnMgbWVudSB0aGF0IG9ubHkgY29udGFpbnMgdGhvc2UgY291bnRpZXMuDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL3FnaXMtY2xpcHBlZC1kYXRhLnBuZyIgYWx0PSJDbGlwcGVkIERhdGEiIHN0eWxlPSJ3aWR0aDoxMDAlIj48L2Rpdj48ZmlnY2FwdGlvbj48c21hbGw+PGI+Q29sb3JzIGFsdGVyZWQgZnJvbSBwcmV2aW91cyBpbWFnZXMgdG8gaGlnaGxpZ2h0IGdlb3Byb2Nlc3NpbmcgcmVzdWx0cy48L2I+PC9zbWFsbD48L2ZpZ2NhcHRpb24+PC9wPg0KDQpGaW5hbGx5LCB3aGlsZSBoYXZpbmcgdGhlIGluZGl2aWR1YWwgaHVycmljYW5lIHRyYWN0cyBjYW4gYmUgaW1wb3J0YW50LCBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZXhlcmNpc2UgeW91IGFyZSBnb2luZyB0byB1c2UgdGhlICoqTWVyZ2UgdmVjdG9yIGxheWVycyoqIHRvb2wgdG8gY29tYmluZWQgYWxsIG9mIHRoZSBpbmRpdmlkdWFsIGh1cnJpY2FuZSB0cmFjdHMgaW50byBhIHNpbmdsZSBkYXRhc2V0LiBUbyBsb2NhdGUgdGhpcyB0b29sIHlvdSB3aWxsIG5lZWQgdG8gY2xpY2sgdGhlIF9Ub29sYm94XyZuYnNwOyBidXR0b24gPGltZyBzcmM9ICJJbWFnZXMvcWdpcy10b29sYm94LWJ1dHRvbi5qcGciIGFsdD0iUHJvY2Vzc2luZyBUb29sYm94IEJ1dHRvbiIgd2lkdGggPSAiMjAiIGhlaWdodCA9ICIyMCI+IG9uIHRoZSB0b29sYmFyLiBUaGlzIHdpbGwgb3BlbiB0aGUgKipQcm9jZXNzaW5nIFRvb2xib3gqKiBzaWRlIG1lbnUgYW5kIGFsbG93IHlvdSB0byBzZWFyY2ggZm9yIG1lcmdlLg0KDQpEb3VibGUgY2xpY2sgb24gdGhlICoqTWVyZ2UgdmVjdG9yIGxheWVycyoqIHRvb2wgYW5kIGluIHRoZSBuZXcgd2luZG93IGNsaWNrIHRoZSA8aW1nIHNyYz0gIkltYWdlcy9xZ2lzLWZvbGRlci1zZWxlY3QtYnV0dG9uLmpwZyIgYWx0PSJTZWxlY3QgRm9sZGVyIGFuZCBGaWxlIE5hbWUiIHdpZHRoID0gIjIwIiBoZWlnaHQgPSAiMjAiPiBidXR0b24gZm9yIHRoZSBfSW5wdXQgbGF5ZXJzXy4gVGhlIHdpbmRvdyB3aWxsIHNoaWZ0IHRvIGFsbG93IHlvdSB0byBzZWxlY3QgYWxsIG9mIHRoZSBpbmRpdmlkdWFsIGh1cnJpY2FuZSB0cmFjdCBsYXllcnMuIFdoZW4gY29tcGxldGUgY2xpY2sgdGhlIHJldHVybiBhcnJvdyA8aW1nIHNyYz0gIkltYWdlcy9xZ2lzLWlucHV0LWxheWVycy1yZXR1cm4tYnV0dG9uLmpwZyIgYWx0PSJTZWxlY3QgRm9sZGVyIGFuZCBGaWxlIE5hbWUiIHdpZHRoID0gIjIwIiBoZWlnaHQgPSAiMjAiPiB0byBnbyBiYWNrIHRvIHRoZSBNZXJnZSBWZWN0b3IgTGF5ZXJzIGRpYWxvZyBib3guIFRoZSBfSW5wdXQgbGF5ZXJzXyZuYnNwOyBzaG91bGQgbm93IHNheSAiNSBpbnB1dHMgc2VsZWN0ZWQuIiBOZXh0LCBjbGljayB0aGUgPGltZyBzcmM9ICJJbWFnZXMvcWdpcy1mb2xkZXItc2VsZWN0LWJ1dHRvbi5qcGciIGFsdD0iU2VsZWN0IEZvbGRlciBhbmQgRmlsZSBOYW1lIiB3aWR0aCA9ICIyMCIgaGVpZ2h0ID0gIjIwIj4gYnV0dG9uIGZvciB0aGUgc2VjdGlvbiB0aGF0IHNheXMgX01lcmdlZF8uIFdoaWxlIHlvdSBjb3VsZCBtYWtlIHRoaXMgYSB0ZW1wb3JhcnkgbGF5ZXIsIGl0IHdvdWxkIGJlIGJlc3QgdG8gc2F2ZSB0aGUgZmlsZSBzaW1pbGFyIHRvIGluIHRoZSBwcmV2aW91cyBzdGVwcyB0byByZXRhaW4gYWNjZXNzIHRvIHRoZSBuZXcgZGF0YXNldC4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvcWdpcy1tZXJnZS1kaWFsb2cyLnBuZyIgYWx0PSJNZXJnZWQgVmVjdG9yIExheWVycyBEaWFsb2ciIHN0eWxlPSJ3aWR0aDoxMDAlIj48L2Rpdj48L3A+DQoNCk5vdyB5b3UgY2FuIHJlbW92ZSB0aGUgX1VTQV9Db3VudGllc18mbmJzcDsgYW5kIGFsbCB0aGUgaW5kaXZpZHVhbCBodXJyaWNhbmUgdHJhY3QgZmlsZXMgdG8gcmVkdWNlIHRoZSBjbHV0dGVyIGluIHlvdXIgTGF5ZXJzIG1lbnUuIFRvIGRvIHRoaXMgeW91IHNpbXBseSByaWdodC9DUlRMLWNsaWNrIG9uIHRoZSBkYXRhc2V0IGluIHRoZSBMYXllcnMgbWVudSBhbmQgY2xpY2sgX1JlbW92ZSBMYXllcl8gb3IgaGlkaW5nIHRoZSBsYXllciBieSB1bmNoZWNraW5nIHRoZSBfaGlkZSBsYXllcl8mbmJzcDsgYnV0dG9uIDxpbWcgc3JjPSAiSW1hZ2VzL3FnaXMtaGlkZS1sYXllci1idXR0b24uanBnIiBhbHQ9IkhpZGUgTGF5ZXIgQnV0dG9uIiB3aWR0aCA9ICIyMCIgaGVpZ2h0ID0gIjIwIj4uIA0KDQo8cCBhbGlnbj0iY2VudGVyIj48ZGl2IGNsYXNzPSJ6b29tIj48aW1nIHNyYz0gIkltYWdlcy9xZ2lzLW1lcmdlZC1kYXRhLnBuZyIgYWx0PSJNZXJnZWQgRGF0YSBFeGFtcGxlIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9kaXY+PC9wPg0KDQo8YmlnPjxiPlF1ZXN0aW9uIE5vLiAxPC9iPjwvYmlnPg0KPGJsb2NrcXVvdGU+DQpIb3cgbWFueSBpbmRpdmlkdWFsIHRyYWN0IHNlZ21lbnRzIGFyZSBjb250YWluZWQgaW4gdGhlIG1lcmdlZCBodXJyaWNhbmUgZGF0YXNldD8NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KPGhyPjwvaHI+DQoNCjxkZXRhaWxzPjxzdW1tYXJ5PjxiaWc+VmlldyBkaXJlY3Rpb25zIGluIDxiPiBbUl17c3R5bGU9ImNvbG9yOiAjNjQ5NUVEIn0gPC9iPjwvc3Bhbj48L2JpZz48L3N1bW1hcnk+DQpCZWZvcmUgeW91IGJlZ2luLCB5b3Ugd2lsbCBuZWVkIHRvIG9wZW4gdGhlIFtFeDIgQ29sYWIgTm90ZWJvb2tdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc21nZW50cnkvR0lTMS1FeGVyY2lzZS05L2Jsb2IvbWFpbi9HSVMxX0VYOS5pcHluYikgYW5kIGluc2VydCAqKnRvY29sYWIqKiBhZnRlciBfZ2l0aHViXyBpbiB0aGUgVVJMIHRvIG9wZW4gaW4gdGhlIF9Db2xhYiBFbnZpcm9ubWVudF8uIEFzIHlvdSBoYXZlIHNlZW4gYmVmb3JlLCBSIHJlcXVpcmVzIHZhcmlvdXMgcGFja2FnZXMgdG8gY29tcGxldGUgY2VydGFpbiBhbmFseXNlcy4gSW4gdGhpcyBleGVyY2lzZSB5b3Ugd2lsbCBiZSB1c2luZyAqKnRpZHl2ZXJzZSwgT3BlblN0cmVldE1hcHMsIGdnZm9ydGlmeSwgbWFwdG9vbHMsIGFuZCByZ2VvcyoqLiBUbyBpbnN0YWxsIGFuZCBsb2FkIHRoZSBwYWNrYWdlcyB3ZSB3aWxsIHVzZSB0aGUgZm9sbG93aW5nIHNjcmlwdDoNCg0KQmxhaC4uLmJsYWguLi5ibGFoLi4uDQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDE8L2I+PC9iaWc+DQo8YmxvY2txdW90ZT4NCl9JbnNlcnQgVGV4dCBIZXJlXw0KPC9ibG9ja3F1b3RlPg0KDQo8L2RldGFpbHM+DQoNCiMjIFN0ZXAgVHdvOiBUaGUgQW5hbHlzZXMNCg0KSW4gdGhpcyBzdGVwIHlvdSB3aWxsIG9yZ2FuaXplIGFuZCBkaXNwbGF5IHRoZSBkYXRhIGluIG9yZGVyIHRvIHByZXBhcmUgaXQgZm9yIHRoZSBmaW5hbCB2aXN1YWxpemF0aW9uLg0KDQo8ZGV0YWlscz4NCjxzdW1tYXJ5PjxiaWc+VmlldyBEaXJlY3Rpb25zIGluIDxiPiBbQXJjR0lTIFByb117c3R5bGU9ImNvbG9yOiNmZjQ1MDAifSA8L2I+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpOb3cgdGhhdCB5b3UgaGF2ZSB0aGUgbmVjZXNzYXJ5IGRhdGEsIHlvdSBuZWVkIGRldGVybWluZSB3aGljaCBjb3VudGllcyBhcmUgbW9zdCBzaWduaWZpY2FudGx5IGltcGFjdGVkIGJ5IHRoZSBodXJyaWNhbmVzLiBCZWNhdXNlIGh1cnJpY2FuZSB3aW5kcyBjYW4gaW1wYWN0IGFyZWFzIGZhciBhd2F5IGZyb20gdGhlIGV5ZSBvciB0aGUgc3Rvcm0sIHlvdSB3aWxsIGJlZ2luIGJ5IGNyZWF0aW5nIGEgYnVmZmVyIGFyb3VuZCB0aGUgaHVycmljYW5lIHRyYWN0cy4gWW91IGNhbiBlaXRoZXIgdXNlIHRoZSAqKlRvb2xzKiogYnV0dG9uIDxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy10b29sYm94LWJ1dHRvbi5qcGciIGFsdD0iR2VvcHJvY2Vzc2luZyBUb29scyBCdXR0b24iIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCI+IG9uIHRoZSBfQW5hbHlzaXMgVGFiXyZuYnNwOyBvciBzZWFyY2ggZm9yICoqQnVmZmVyKiogaW4gdGhlIGxpc3Qgb2YgdG9vbHMgbmV4dCB0byB0aGUgYnV0dG9uLiBJbiB0aGUgQnVmZmVyIHdpbmRvdyBzZWxlY3QgdGhlIGZvbGxvd2luZyBvcHRpb25zIGFuZCBjbGljayBydW46DQoNCi0gX0lucHV0IEZlYXR1cmVzXyA9IFRoZSBtZXJnZWQgaHVycmljYW5lIGRhdGFzZXQNCi0gX091dHB1dCBGZWF0dXJlIENsYXNzXyA9IGNob29zZSBhIG5hbWUgZm9yIHlvdXIgZmlsZSBhbmQgYWRkIC5zaHAgYmVoaW5kIGl0IHRvIGNyZWF0ZSBhIHNoYXBlZmlsZQ0KLSBfRGlzdGFuY2VfID0gNTAgbWlsZXMgKGxpbmVhciB1bml0KQ0KLSBfU2lkZSBUeXBlXyA9IEZ1bGwNCi0gX0VuZCBUeXBlXyA9IFJvdW5kDQotIF9NZXRob2RfID0gUGxhbmFyDQotIF9EaXNzb2x2ZSBUeXBlXyA9IERpc3NvbHZlIGFsbCBvdXRwdXQgZmVhdHVyZXMgaW50byBhIHNpbmdsZSBmZWF0dXJlDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy1idWZmZXItZGF0YS5wbmciIGFsdD0iQnVmZmVyIFRvb2wiIHN0eWxlPSJ3aWR0aDoxMDAlIj48L2Rpdj48L3A+DQoNCklmIGluIHRoaXMgc3RlcCBvciB0aGUgbmV4dCB5b3UgZW5jb3VudGVyIGEgd2FybmluZyBzdGF0aW5nIHRoZXJlIGlzIGEgImRhdHVtIGNvbmZsaWN0IGJldHdlZW4gdGhlIGlucHV0IGFuZCBvdXRwdXQiLCBqdXN0IHByb2NlZWQgd2l0aCB0aGUgZXhlcmNpc2UuIFdlIHdpbGwgZGlzY3VzcyBfZGF0dW1zXywgYSBzZXQgb2YgcmVmZXJlbmNlIHBvaW50cyBvbiB0aGUgZWFydGgncyBzdXJmYWNlIGFnYWluc3Qgd2hpY2ggcG9zaXRpb24gbWVhc3VyZW1lbnRzIGFyZSBtYWRlLCBpbiBmdXR1cmUgZXhlcmNpc2VzLiBXaGlsZSB0aGV5IGFyZSBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCwgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGV4ZXJjaXNlIHlvdSBjYW4gaWdub3JlIHRoZSB3YXJuaW5nLg0KDQpJbiB0aGlzIG5leHQgc3RlcCB5b3UgbmVlZCB0byBpc29sYXRlIG9ubHkgdGhlIGNvdW50aWVzIHRoYXQgYXJlIGxvY2F0ZWQgd2l0aGluIHRoaXMgYnVmZmVyLiBUbyBkbyB0aGlzLCBjbGljayB0aGUgKipTZWxlY3QgQnkgTG9jYXRpb24qKiBidXR0b24gPGltZyBzcmM9ICJJbWFnZXMvYXJjZ2lzLXNlbGVjdC1sb2NhdGlvbi1idXR0b24uanBnIiBhbHQ9IlNlbGVjdCBCeSBMb2NhdGlvbiBCdXR0b24iIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCI+IG9uIHRoZSBfTWFwIFRhYl8mbmJzcDsgaW4gdGhlIFNlbGVjdGlvbiBTZWN0aW9uLiBJbiB0aGUgbmV3IG1lbnUgY2hvb3NlIHRoZSBmb2xsb3dpbmcgYW5kIGNsaWNrIE9LLg0KDQotIF9JbnB1dCBGZWF0dXJlc18gPSBZb3VyIGNsaXBwZWQgY291bnRpZXMNCi0gX1JlbGF0aW9uc2hpcF8gPSBDaG9vc2UgSW50ZXJzZWN0DQotIF9TZWxlY3RpbmcgRmVhdHVyZXNfID0gWW91ciBidWZmZXJlZCBodXJyaWNhbmVzDQotIF9TZWxlY3Rpb24gVHlwZV8gPSBOZXcgU2VsZWN0aW9uDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy1zZWxlY3QtYnktbG9jYXRpb24ucG5nIiBhbHQ9IlNlbGVjdCBCeSBMb2NhdGlvbiIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KV2l0aCB0aGlzIHNlbGVjdGlvbiBtYWRlLCB5b3UgY2FuIHRha2UgdGhlIHNhbWUgc3RlcHMgYXMgYmVmb3JlIHRvIGNyZWF0ZSBhIG5ldyBkYXRhc2V0IGJ5IHJpZ2h0LWNsaWNraW5nIG9uIHRoZSBjbGlwcGVkIGNvdW50aWVzIGRhdGFzZXQgaW4gdGhlIFRhYmxlIG9mIENvbnRlbnRzLCBnb2luZyB0byBfRGF0YSA+IEV4cG9ydCBGZWF0dXJlc18mbmJzcDsgYW5kIGNyZWF0aW5nIGEgbmV3IHNoYXBlZmlsZSBvZiB0aGUgc2VsZWN0ZWQgY291bnRpZXMuIFlvdSBjYW4gbm93IHJlbW92ZSB0aGUgY2xpcHBlZCBjb3VudGllcyB5b3UgY3JlYXRlZCBpbiBzdGVwIG9uZSBvciBjaGFuZ2UgdGhlIHN5bWJvbG9neSB0byBtYWtlIHRoaXMgbmV3IHNlbGVjdGlvbiBzdGFuZCBvdXQuDQoNClRvIGFuc3dlciB0aGUgZm9sbG93aW5nIHF1ZXN0aW9uLCBvcGVuIHRoZSBhdHRyaWJ1dGUgdGFibGUgZm9yIHRoZSBuZXcgZGF0YXNldCB5b3UgY3JlYXRlZCBoaWdobGlnaHRpbmcgdGhlIGltcGFjdGVkIGNvdW50aWVzLiBSaWdodC1jbGljayBvbiB0aGUgY29sdW1uIGhlYWRlciBmb3IgdGhlICoqUG9wdWxhdGlvbioqIHZhcmlhYmxlLCBhbmQgc2VsZWN0IHN0YXRpc3RpY3MuDQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDI8L2I+PC9iaWc+DQo8YmxvY2txdW90ZT4NCldoYXQgaXMgdGhlIHRvdGFsIHBvcHVsYXRpb24gKHN1bSBpbmZvcm1hdGlvbikgb2YgdGhlIGNvdW50aWVzIGltcGFjdGVkIGJ5IHRoZXNlIGh1cnJpY2FuZXM/DQo8L2Jsb2NrcXVvdGU+DQoNCjwvZGV0YWlscz4NCjxocj48L2hyPg0KDQo8ZGV0YWlscz4NCjxzdW1tYXJ5PjxiaWc+VmlldyBEaXJlY3Rpb25zIGluIDxiPiBbUUdJU117c3R5bGU9ImNvbG9yOiMwMDY0MDAifSA8L2I+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpOb3cgdGhhdCB5b3UgaGF2ZSB0aGUgbmVjZXNzYXJ5IGRhdGEsIHlvdSBuZWVkIGRldGVybWluZSB3aGljaCBjb3VudGllcyBhcmUgbW9zdCBzaWduaWZpY2FudGx5IGltcGFjdGVkIGJ5IHRoZSBodXJyaWNhbmVzLiBCZWNhdXNlIGh1cnJpY2FuZSB3aW5kcyBjYW4gaW1wYWN0IGFyZWFzIGZhciBhd2F5IGZyb20gdGhlIGV5ZSBvciB0aGUgc3Rvcm0sIHlvdSB3aWxsIGJlZ2luIGJ5IGNyZWF0aW5nIGEgYnVmZmVyIGFyb3VuZCB0aGUgaHVycmljYW5lIHRyYWN0cy4gWW91IGNhbiBlaXRoZXIgZ28gdG8gKipWZWN0b3IgPiBHZW9wcm9jZXNzaW5nIFRvb2xzID4gQnVmZmVyKiogb24gdGhlIG1lbnUgYmFyIG9yIHNlYXJjaCBmb3IgKipCdWZmZXIqKiBpbiB0aGUgX1Byb2Nlc3NpbmcgVG9vbGJveF8mbmJzcDsgKHNpbWlsYXIgdG8gc2VhcmNoaW5nIGZvciBNZXJnZSkuIERvdWJsZS1jbGljayBvbiB0aGUgQnVmZmVyIHRvb2wsIHNlbGVjdCB0aGUgZm9sbG93aW5nIG9wdGlvbnMgYW5kIGNsaWNrIFJ1bjoNCg0KPHAgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9ICJJbWFnZXMvcWdpcy1idWZmZXItYW5hbHlzaXMucG5nIiBhbHQ9IkJ1ZmZlciBUb29sIERpYWxvZyIgc3R5bGU9IndpZHRoOjc1JSI+PC9wPg0KDQotIF9JbnB1dCBsYXllcl8gPSBUaGUgbWVyZ2VkIGh1cnJpY2FuZSBmaWxlIHlvdSBjcmVhdGVkDQotIF9EaXN0YW5jZV8gPSAwLjgNCi0gX1NlZ21lbnRzXyA9IDQNCi0gX0VuZCBjYXAgc3R5bGVfID0gUm91bmQNCi0gX0pvaW4gc3R5bGVfID0gUm91bmQNCi0gX01pdGVyIGxpbWl0XyA9IDIuMA0KLSBDaGVjayB0aGUgYm94IGZvciBfRGlzc29sdmUgcmVzdWx0Xw0KLSBfQnVmZmVyZWRfIHNhdmUgdGhlIGZpbGUgaW4geW91ciBwcm9qZWN0IGZvbGRlcg0KDQpZb3UgbWF5IHJlY2VpdmUgYSB3YXJuaW5nIGFib3V0IHVzaW5nIGRlZ3JlZXMgdG8gY2FsY3VsYXRlIHRoZSBidWZmZXIuIElmIHNvIHlvdSBjYW4gZGlzbWlzcyBpdCBmb3Igbm93LiBJbiBmdXR1cmUgZXhlcmNpc2VzIHlvdSB3aWxsIHByb2plY3QgeW91ciBkYXRhc2V0LCBob3dldmVyIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBleGVyY2lzZSB5b3UgY2FuIGlnbm9yZSB0aGUgd2FybmluZy4gWW91ciBzY3JlZW4gc2hvdWxkIG5vdyBsb29rIHNpbWlsYXIgdG8gdGhpcyAoY29sb3JzIGhhdmUgYmVlbiBhbHRlcmVkIHRvIGhpZ2hsaWdodCB0aGUgcmVzdWx0cyk6DQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL3FnaXMtYnVmZmVyZWQtZGF0YS5wbmciIGFsdD0iQnVmZmVyZWQgaHVycmljYW5lIGRhdGFzZXQiIHN0eWxlPSJ3aWR0aDoxMDAlIj48L2Rpdj48L3A+DQoNCkZvciB0aGlzIGV4ZXJjaXNlLCB5b3UgYXJlIGdvaW5nIHRvIGFkZCBzYXRlbGxpdGUgaW1hZ2VyeSBmcm9tIGEgcmVtb3RlIGNvbm5lY3Rpb24uIEluIHRoZSBicm93c2VyLCBzY3JvbGwgZG93biB0byAqKlhZWiBUaWxlcyoqIGFuZCByaWdodC9DUlRMLWNsaWNrIHRvIGFkZCBhIOKAnE5ldyBDb25uZWN0aW9u4oCdLiBJbiB0aGUgcmVzdWx0aW5nIHdpbmRvdyBuYW1lIHRoZSBjb25uZWN0aW9uIOKAnEdvb2dsZSBTYXRlbGxpdGXigJ0gYW5kIHR5cGUgdGhlIGZvbGxvd2luZyBpbnRvIHRoZSBVUkw6DQoNCmBgYA0KaHR0cHM6Ly9tdDEuZ29vZ2xlLmNvbS92dC9seXJzPXMmeD17eH0meT17eX0mej17en0NCmBgYA0KDQpZb3UgY2FuIG5vdyBjbGljayBhbmQgZHJhZyAqKkdvb2dsZSBTYXRlbGxpdGUqKiBpbnRvIHRoZSBsYXllciB0byB2aWV3IHRoZSBzYXRlbGxpdGUgaW1hZ2VyeS4gUmVtZW1iZXIgdG8gYXJyYW5nZSB5b3VyIGxheWVyIHNvIHRoYXQgZWl0aGVyIHRoZSBmaWxsIGZvciBjb3VudGllcyBpcyB0cmFuc3BhcmVudCBvciB0aGUgc2F0ZWxsaXRlIGxheWVyIGlzIGFib3ZlIHRoZSBjb3VudGllcyBzbyB5b3UgY2FuIHNlZSB0aGUgaW1hZ2VyeS4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvcWdpcy1kYXRhLXdpdGgtc2F0ZWxsaXRlLnBuZyIgYWx0PSJBZGRpbmcgc2F0ZWxsaXRlIGRhdGEgYmFzZW1hcCIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KSW4gdGhpcyBuZXh0IHN0ZXAgeW91IG5lZWQgdG8gaXNvbGF0ZSBvbmx5IHRoZSBjb3VudGllcyB0aGF0IGFyZSBsb2NhdGVkIHdpdGhpbiB0aGUgaHVycmljYW5lIGJ1ZmZlci4gVG8gZG8gdGhpcywgY2xpY2sgKipWZWN0b3IgPiBSZXNlYXJjaCBUb29scyA+IFNlbGVjdCBCeSBMb2NhdGlvbioqIGZyb20gdGhlIG1lbnUgYmFyLiBJbiB0aGUgbmV3IG1lbnUgY2hvb3NlIHRoZSBmb2xsb3dpbmcgYW5kIGNsaWNrIFJ1bg0KDQo8cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0gIkltYWdlcy9xZ2lzLXNlbGVjdC1ieS1sb2NhdGlvbi5qcGciIGFsdD0iU2VsZWN0IGJ5IGxvY2F0aW9uIHRvb2wiIHN0eWxlPSJ3aWR0aDo3NSUiPjwvcD4NCg0KLSBfU2VsZWN0IGZlYXR1cmVzIGZyb21fID0gVGhlIGNsaXBwZWQgY291bnRpZXMgZGF0YXNldC4gVGhpcyBpcyB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIGNvdW50aWVzIGluIHRoZSBzZWxlY3RlZCBzdGF0ZXMuDQotIF9XaGVyZSB0aGUgZmVhdHVyZXMgKGdlb21ldHJpYyBwcmVkaWNhdGUpXyA9IENoZWNrIHRoZSBib3ggZm9yICoqaW50ZXJzZWN0KioNCi0gX0J5IGNvbXBhcmluZyB0byB0aGUgZmVhdHVyZXMgZnJvbV8gPSBUaGUgaHVycmljYW5lIGJ1ZmZlciBkYXRhc2V0DQotIF9Nb2RpZnkgY3VycmVudCBzZWxlY3Rpb24gYnlfID0gQ3JlYXRpbmcgbmV3IHNlbGVjdGlvbg0KDQpXaXRoIHRoaXMgc2VsZWN0aW9uIG1hZGUsIHlvdSBjYW4gdGFrZSB0aGUgc2FtZSBzdGVwcyBhcyBiZWZvcmUgdG8gY3JlYXRlIGEgbmV3IGRhdGFzZXQgYnkgcmlnaHQvQ1JUTC1jbGlja2luZyBvbiB0aGUgY2xpcHBlZCBjb3VudGllcyBkYXRhc2V0IGluIHRoZSBMYXllcnMgbWVudSwgZ29pbmcgdG8gKipFeHBvcnQgPiBTYXZlIFNlbGVjdGVkIEZlYXR1cmVzIEFzLi4uKiogYW5kIGNyZWF0aW5nIGEgbmV3IHNoYXBlZmlsZSBvZiB0aGUgc2VsZWN0ZWQgY291bnRpZXMuIA0KDQo8cCBhbGlnbj0iY2VudGVyIj48ZGl2IGNsYXNzPSJ6b29tIj48aW1nIHNyYz0gIkltYWdlcy9xZ2lzLXNlbGVjdGVkLXNhdmUucG5nIiBhbHQ9IkV4cG9ydGluZyB0aGUgY3VycmVudCBzZWxlY3Rpb24iIHN0eWxlPSJ3aWR0aDoxMDAlIj48L2Rpdj48L3A+DQoNCllvdSBjYW4gbm93IHJlbW92ZSB0aGUgY2xpcHBlZCBjb3VudGllcyB5b3UgY3JlYXRlZCBpbiBzdGVwIG9uZSBvciBjaGFuZ2UgdGhlIHN5bWJvbG9neSB0byBtYWtlIHRoaXMgbmV3IHNlbGVjdGlvbiBzdGFuZCBvdXQuDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL3FnaXMtc2VsZWN0LWJ5LWxvY2F0aW9uLWRhdGEucG5nIiBhbHQ9IkFsbCBBbmFseXplZCBEYXRhc2V0cyIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KVG8gYW5zd2VyIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb24sIGNsaWNrIHRoZSBfU2hvdyBTdGF0aXN0aWNhbCBTdW1tYXJ5XyZuYnNwOyBidXR0b24gPGltZyBzcmM9ICJJbWFnZXMvcWdpcy1zdGF0aXN0aWNhbC1zdW1tYXJ5LWJ1dHRvbi5qcGciIGFsdD0iU2hvdyBTdGF0aXN0aWNhbCBTdW1tYXJ5IEJ1dHRvbiIgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIj4gb24gdGhlIG1lbnUgYmFyLiBBIG5ldyBtZW51IHdpbGwgb3BlbiBpbiB0aGUgbGVmdC1oYW5kIGNvbHVtbiBvZiB0aGUgc2NyZWVuLiBJbiB0aGlzIG1lbnUgc2VsZWN0IHRoZSBkYXRhc2V0IHlvdSBjcmVhdGVkIGZvciB0aGUgaHVycmljYW5lIGltcGFjdGVkIGNvdW50aWVzIGluIHRoZSBmaXJzdCBib3ggYW5kIHBvcHVsYXRpb24gaW4gdGhlIHNlY29uZC4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9ICJJbWFnZXMvcWdpcy1zdGF0aXN0aWNzLW1lbnUucG5nIiBhbHQ9IlN0YXRpc3RpY3MgSW5mb3JtYXRpb24iIHN0eWxlPSJ3aWR0aDo2MCUiPjwvcD4NCg0KPGJpZz48Yj5RdWVzdGlvbiBOby4gMjwvYj48L2JpZz4NCjxibG9ja3F1b3RlPg0KV2hhdCBpcyB0aGUgdG90YWwgcG9wdWxhdGlvbiAoc3VtIGluZm9ybWF0aW9uKSBvZiB0aGUgY291bnRpZXMgaW1wYWN0ZWQgYnkgdGhlc2UgaHVycmljYW5lcz8NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KPGhyPjwvaHI+DQoNCjxkZXRhaWxzPg0KPHN1bW1hcnk+PGJpZz5WaWV3IERpcmVjdGlvbnMgaW4gPGI+IFtSXXtzdHlsZT0iY29sb3I6IzY0OTVFRCJ9IDwvYj48L2JpZz48L3N1bW1hcnk+DQoNCkJsYWguLi5ibGFoLi4uYmxhaC4uLg0KDQo8YmlnPjxiPlF1ZXN0aW9uIE5vLiAyPC9iPjwvYmlnPg0KPGJsb2NrcXVvdGU+DQpfSW5zZXJ0IFRleHQgSGVyZV8NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KDQojIyBTdGVwIFRocmVlOiBUaGUgVmlzdWFsaXphdGlvbg0KDQpZb3Ugd2lsbCBub3cgY3JlYXRlIGEgZ3JhcGhpY2FsIGRpc3BsYXkgb2YgeW91ciBkYXRhIHRoYXQgaW5jbHVkZXMgY2FydG9ncmFwaGljIGVsZW1lbnRzIHN1Y2ggYXMgbGVnZW5kLCBzY2FsZSBiYXIsIG5vcnRoIGFycm93LCBldGMuIEluIHRoaXMgdmlzdWFsaXphdGlvbiB5b3Ugd2lsbCBhbHNvIGxlYXJuIHRvIGFkZCBhIGRpZmZlcmVudCBiYXNlbWFwLCBhZGQgYW4gaW5zZXQgb3Igb3ZlcnZpZXcgbWFwLCBhbmQgYWx0ZXIgdGhlIHByb2plY3RlZCBjb29yZGluYXRlIHN5c3RlbS4gDQoNCjxkZXRhaWxzPjxzdW1tYXJ5PjxiaWc+VmlldyBkaXJlY3Rpb25zIGluIDxiPiBbQXJjR0lTIFByb117c3R5bGU9ImNvbG9yOiNmZjQ1MDAifSA8L2I+PC9zcGFuPjwvYmlnPjwvc3VtbWFyeT4NCg0KT24gdGhlIF9NYXAgVGFiXyZuYnNwOyBjbGljayB0aGUgKipCYXNlbWFwKiogYnV0dG9uIDxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy1iYXNlbWFwLWJ1dHRvbi5qcGciIGFsdD0iQmFzZW1hcHMiIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCI+IGFuZCBzZWxlY3QgdGhlIG9wdGlvbiBmb3IgX09jZWFuc18uIFJlbWVtYmVyIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBkYXRhc2V0cyBpbiB0aGUgVGFibGUgb2YgQ29udGV0cyBkZXRlcm1pbmVzIHdoYXQgb3JkZXIgdGhleSBhcmUgZGlzcGxheWVkLg0KDQo8cCBhbGlnbj0iY2VudGVyIj48ZGl2IGNsYXNzPSJ6b29tIj48aW1nIHNyYz0gIkltYWdlcy9hcmNnaXMtYmFzZW1hcHMucG5nIiBhbHQ9IkJhc2VtYXBzIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9kaXY+PC9wPg0KDQpJbiBmdXR1cmUgZXhlcmNpc2VzIHlvdSBtYXkgY2hvb3NlIGFueSBvZiB0aGVzZSBiYXNlbWFwIG9wdGlvbnMgdGhhdCBhcmUgYXBwcnJvcHJpYXRlIGZvciB5b3VyIGFuYWx5c2VzLiBOZXh0LCBvbiB0aGUgX0luc2VydCBUYWJfJm5ic3A7IGNsaWNrIHRoZSBidXR0b24gZm9yICoqTmV3IE1hcCoqIDxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy1uZXctbWFwLWJ1dHRvbi5qcGciIGFsdD0iSW5zZXJ0IE5ldyBNYXAiIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCI+IGFuZCBzZWxlY3QgTmV3IE1hcC4gQSBuZXcgbWFwIHRhYiAocHJvYmFibHkgY2FsbGVkIE1hcDIpIHdpbGwgYXBwZWFyIGluIHlvdXIgbWFwIGZyYW1lLiBBZGQgKG9yIGNvcHkvcGFzdGUgZnJvbSB0aGUgb3JpZ2luYWwgbWFwKSB0aGUgaHVycmljYW5lIGltcGFjdGVkIGNvdW50aWVzIGFuZCB0aGUgY29udGluZW50YWwgVVMgU3RhdGVzIHNoYXBlZmlsZXMgYXMgd2VsbCBhcyB0aGUgT2NlYW5zIGJhc2VtYXAgdG8gdGhpcyBuZXcgbWFwLiBCZSBzdXJlIHRvIHpvb20gaW4gYSBhcHByb3ByaWF0ZSB0byBzZWUgdGhlIGRhdGEuDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy1tYXAyLnBuZyIgYWx0PSJJbnNldCBNYXAiIHN0eWxlPSJ3aWR0aDoxMDAlIj48L3A+DQoNClRvIHJldHVybiB0byB0aGUgb3JpZ2luYWwgbWFwIHNpbXBseSBjbGljayBvbiB0aGUgYXBwcm9wcmlhdGUgdGFiLiBUaGlzIHdpbGwgYWxsb3cgeW91IHRvIHN3aXRjaCBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIHRoZSB0d28gaW4gb3JkZXIgdG8gbWFrZSB0aGUgbmVjZXNzYXJ5IGN1c3RvbWl6YXRpb25zLiBJdCBtYXkgYmUgYmVuZWZpY2lhbCB0byByZW5hbWUgZWFjaCBvbmUgdG8ga2VlcCB0cmFjayBvZiB0aGUgcHVycG9zZSBmb3IgZWFjaCBtYXAuDQoNCk5leHQgeW91IGNhbiBjaGFuZ2UgdGhlIHByb2plY3Rpb24gb2YgdGhlIGNvb3JkaW5hdGUgc3lzdGVtIGZvciB0aGUgaW5zZXQgbWFwIChNYXAyKS4gSW4gdGhlIFRhYmxlIG9mIENvbnRlbnRzLCByaWdodC1jbGljayBvbiAqKk1hcDIqKiBhbmQgc2VsZWN0IF9Qcm9wZXJ0aWVzXy4gSW4gdGhlIHJlc3VsdGluZyB3aW5kb3cgY2xpY2sgKipDb29yZGluYXRlIFN5c3RlbXMqKiBmcm9tIHRoZSBsZWZ0LXNpZGUgbWVudS4gVW5kZXIgIlhZIENvb3JkaW5hdGUgU3lzdGVtcyBBdmFpbGFibGUiIHNjcm9sbCBkb3duIHVudGlsIHlvdSBzZWUgX1Byb2plY3RlZCBDb29yZGluYXRlIFN5c3RlbV8uIFVzaW5nIHRoZSBzZXJpZXMgb2YgZHJvcC1kb3duIG1lbnVzIGdvIHRvICoqUHJvamVjdGVkIENvb3JkaW5hdGUgU3lzdGVtID4gQ29udGluZW50YWwgPiBOb3J0aCBBbWVyaWNhKiogYW5kIHNlbGVjdCB0aGUgb3B0aW9uIGZvciAiTm9ydGggQW1lcmljYSBBbGJlcnMgRXF1YWwgQXJlYSBDb25pYyIgYW5kIGNsaWNrIE9LLiBZb3Ugc2hvdWxkIG5vdGljZSB0aGF0IHRoZSBhd2t3YXJkICJmbGF0IHRvcCIgYm9yZGVyIG9mIHRoZSBVbml0ZWQgU3RhdGVzIHNob3VsZCBub3cgbWUgY3VydmVkIGFuZCB0aGUgb3ZlcmFsbCBzaGFwZSBvZiB0aGUgc3RhdGVzIGhhcyBhIG1vcmUgcGxlYXNpbmcgYXBwZWFyYW5jZS4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvYXJjZ2lzLWNvb3JkaW5hdGUtc3lzdGVtcy5wbmciIGFsdD0iQWx0ZXJpbmcgQ29vcmRpbmF0ZSBzeXN0ZW1zIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9kaXY+PC9wPg0KDQpJbiBsZWN0dXJlIHdlIHdpbGwgZGlzY3VzcyB0aGUgaW1wb3J0YW5jZSBvZiBwcm9qZWN0aW9ucyBhbmQgY29vcmRpbmF0ZSBzeXN0ZW1zLiBJbiBmdXR1cmUgZXhlcmNpc2VzIHlvdSBzaG91bGQgdGFrZSBzb21lIHRpbWUgdG8gc2VsZWN0IGRpZmZlcmVudCBvcHRpb25zIHRvIHNlZSB3aGljaCBfQ29vcmRpbmF0ZSBTeXN0ZW1fJm5ic3A7IGhhcyB0aGUgbW9zdCBwbGVhc2luZyBzaGFwZSB0byB5b3VyIGV5ZXMuDQoNCkl0IGlzIG5vdyB0aW1lIGZvciB5b3UgdG8gbWFrZSB5b3VyIG1hcC4gU2ltaWxhciB0byAqKltwcmV2aW91cyBleGVyY2lzZXNdKGh0dHBzOi8vY2hyaXNtZ2VudHJ5LmdpdGh1Yi5pby9HSVMxLUV4ZXJjaXNlLTIvIzEzX1N0ZXBfVGhyZWU6X1RoZV9WaXN1YWxpemF0aW9uKSoqLCB5b3UgbmVlZCB0byBhZGQgYWxsIG9mIHRoZSBuZWNlc3NhcnkgZWxlbWVudHMgZGlzY3Vzc2VkIGluIEV4ZXJjaXNlIDIgYW5kIDMuIEluIHRoaXMgZXhlcmNpc2UgeW91IHdpbGwgYWxzbyBuZWVkIHRvIGFkZCB5b3VyIGluc2V0IG1hcCAoTWFwMikuIFRvIGRvIHRoaXMsIHlvdSBmaXJzdCBuZWVkIHRvIGFkZCB0aGUgcHJpbWFyeSBtYXAgd2l0aCB1c2luZyB0aGUgTWFwIEZyYW1lIGJ1dHRvbiBsaWtlIGJlZm9yZS4gTmV4dCB5b3UgY2FuIGNsaWNrIHRoZSBNYXAgRnJhbWUgYnV0dG9uIGFnYWluIHRvIGFkZCB0aGUgc2Vjb25kIG1hcC4NCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvYXJjZ2lzLWFkZC1tYXAyLnBuZyIgYWx0PSJBZGQgSW5zZXQgTWFwIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9kaXY+PC9wPg0KDQpIb3dldmVyLCBmb3IgdGhlIGluc2V0IHlvdSB3YW50IGl0IHRvIGJlIHNtYWxsZXIgYW5kIG5vdCBjb3ZlciB5b3VyIG1hcCBkYXRhLg0KDQo8cCBhbGlnbj0iY2VudGVyIj48ZGl2IGNsYXNzPSJ6b29tIj48aW1nIHNyYz0gIkltYWdlcy9hcmNnaXMtbWFwLWFuZC1pbnNldC5wbmciIGFsdD0iTWFwIHdpdGggSW5zZXQgTWFwIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9kaXY+PC9wPg0KDQpGaW5hbGl6ZSB5b3VyIG1hcCBieSBhZGRpbmcgYWxsIG9mIHRoZSBuZWNlc3NhcnkgbWFwIGVsZW1lbnRzICh0aXRsZSwgbGVnZW5kLCBub3J0aCBhcnJvdywgc2NhbGUgYmFyLCBuYW1lIGFuZCBkYXRlKSBhbmQgYWx0ZXJpbmcgdGhlIHN5bWJvbG9neSBvZiB0aGUgaHVycmljYW5lIGRhdGFzZXQgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGltcG9ydGFudCBkYXRhLiBSZW1lbWJlciB0byByZW5hbWluZyBpdGVtcyBpbiB0aGUgVGFibGUgb2YgQ29udGVudHMgd2lsbCByZW5hbWUgdGhlbSBpbiB0aGUgbGVnZW5kLg0KDQo8cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0gIkltYWdlcy9hcmNnaXMtZmluYWwtbWFwLnBuZyIgYWx0PSJGaW5hbCBNYXAiIHN0eWxlPSJ3aWR0aDoxMDAlIj48L3A+DQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDM8L2I+PC9iaWc+DQo8YmxvY2txdW90ZT4NCkhvdyBtYW55IHRvdGFsIGltcGFjdGVkIGNvdW50aWVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgbmV3IGRhdGFzZXQ/DQo8L2Jsb2NrcXVvdGU+DQoNCjwvZGV0YWlscz4NCjxocj48L2hyPg0KDQo8ZGV0YWlscz48c3VtbWFyeT48YmlnPlZpZXcgZGlyZWN0aW9ucyBpbiA8Yj4gW1FHSVNde3N0eWxlPSJjb2xvcjojMDA2NDAwIn0gPC9iPjwvc3Bhbj48L2JpZz48L3N1bW1hcnk+DQoNClRvIGNyZWF0ZSB0aGlzIHZpc3VhbGl6YXRpb24geW91IGFyZSBnb2luZyB0byBhbHNvIGNyZWF0ZSB3aGF0IGlzIGNhbGxlZCBhbiBpbnNldCBvciBpbmRpY2F0b3IgbWFwLiBUaGVzZSBhcmUgc21hbGxlciBtYXBzIHRoYXQgYXJlIHVzZWQgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGRldGFpbCBhYm91dCBhIHNwZWNpZmljIGxvY2F0aW9uLiBUaGVzZSBtYXBzIGFyZSBvZnRlbiBzbWFsbCBzY2FsZSB2ZXJzaW9ucyBvciB0aGUgcHJpbWFyeSBtYXAsIGJ1dCBzb21ldGltZXMgY2FuIGJlIGxhcmdlciBzY2FsZSB0byBlbmhhbmNlIGRldGFpbCBpbiBjb25nZXN0ZWQgYXJlYXMuIEluIHRoaXMgY2FzZSBpdCB3aWxsIGJlIGEgc21hbGwgc2NhbGUgdmVyc2lvbiBvZiB0aGUgY29udGluZW50YWwgVVMuDQoNClRvIGJlZ2luIHRoaXMgcHJvY2VzcyB5b3UgYXJlIGdvaW5nIHRvIGNyZWF0ZSBzb21lIG9yZ2FuaXphdGlvbnMgaW4gdGhlIExheWVyIE1lbnUgYnkgdXNpbmcgdGhlICoqQWRkIEdyb3VwKiogYnV0dG9uIDxpbWcgc3JjPSAiSW1hZ2VzL3FnaXMtbGF5ZXJzLWFkZC1ncm91cC5qcGciIGFsdD0iQWRkIEdyb3VwcyIgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIj4uIE5hbWUgdGhlIGZpcnN0IGdyb3VwICJNYWluIE1hcCIgYW5kIGNyZWF0ZSBhIHNlY29uZCBncm91cCBjYWxsZWQgIkluc2V0IE1hcCIuIA0KDQo8cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0gIkltYWdlcy9xZ2lzLWxheWVycy1tZW51LWdyb3Vwcy5qcGciIGFsdD0iTGF5ZXJzIEdyb3VwcyIgc3R5bGU9IndpZHRoOjYwJSI+PC9wPg0KDQpJbiB0aGUgTGF5ZXJzIE1lbnUgeW91IGNhbiBjbGljayBhbmQgZHJhZyB0aGUgZGF0YXNldHMgaW50byB0aGUgZGlmZmVyZW50IGdyb3VwcyBhcyB3ZWxsIGFzIHJpZ2h0L0NSVEwtY2xpY2sgdG8gY29weSBhbmQgcGFzdGUuIEZvciB0aGlzIGV4ZXJjaXNlIHlvdSBzaG91bGQgb3JkZXIgeW91ciBkYXRhc2V0cyBhcyBmb2xsb3dzOg0KDQotICoqTWFpbiBNYXAqKg0KICAtIEh1cnJpY2FuZXMgRGF0YXNldA0KICAtIEh1cnJpY2FuZSBJbXBhY3RlZCBDb3VudGllcw0KICAtIFNlbGVjdGVkIFN0YXRlcw0KICAtIENsaXBwZWQgQ291bnRpZXMNCiAgLSBDb250aW5lbnRhbCBVUw0KICAtIEdvb2dsZSBTYXRlbGxpdGUgSW1hZ2VyeQ0KLSAqKkluc2V0IE1hcCoqDQogIC0gSHVycmljYW5lIEJ1ZmZlcg0KICAtIFNlbGVjdGVkIFN0YXRlcw0KICAtIENvbnRpbmVudGFsIFVTDQogIC0gR29vZ2xlIFNhdGVsbGl0ZSBJbWFnZXJ5DQoNCjxwIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSAiSW1hZ2VzL3FnaXMtbGF5ZXJzLXdpdGgtZ3JvdXBzLmpwZyIgYWx0PSJMYXllcnMgR3JvdXBzIiBzdHlsZT0id2lkdGg6NjAlIj48L3A+DQoNClNpbWlsYXIgdG8gKipbcHJldmlvdXMgZXhlcmNpc2VzXShodHRwczovL2NocmlzbWdlbnRyeS5naXRodWIuaW8vR0lTMS1FeGVyY2lzZS0yLyMxM19TdGVwX1RocmVlOl9UaGVfVmlzdWFsaXphdGlvbikqKiwgeW91ciB2aXN1YWxpemF0aW9uIHNob3VsZCBpbmNsdWRlIGFsbCBvZiB0aGUgbmVjZXNzYXJ5IG1hcCBlbGVtZW50cyBkaXNjdXNzZWQgaW4gRXhlcmNpc2UgMiBhbmQgMy4gSG93ZXZlciwgeW91IHdpbGwgYWxzbyBuZWVkIHRvIGFkZCB0aGUgaW5zZXQgbWFwIGZvciB0aGlzIGV4ZXJjaXNlLiBUbyBkbyB0aGlzLCB5b3UgZmlyc3QgbmVlZCB0byBjcmVhdGUgYSBfTmV3IFByaW50IExheW91dF8sIGFuZCB3aXRoIHRoZSAiTWFpbiBNYXAiIHNlbGVjdGVkIGFuZCB0aGUgIkluc2V0IE1hcCIgaGlkZGVuIGluIHRoZSBMYXllcnMgTWVudSwgYW5kIGFkZCB0aGUgbWFwIHdpdGggdGhlIF9BZGQgbWFwXyZuYnNwOyB0b29sIGxpa2UgYmVmb3JlLiANCg0KPHAgYWxpZ249ImNlbnRlciI+PGRpdiBjbGFzcz0iem9vbSI+PGltZyBzcmM9ICJJbWFnZXMvcWdpcy1sYXlvdXQtbWFpbi1tYXAucG5nIiBhbHQ9IkxheW91dCB3aXRoIE1haW4gTWFwIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9kaXY+PC9wPg0KDQpJbiB0aGUgaXRlbSBwcm9wZXJ0aWVzIGZvciB0aGUgbWFwLCBzZXQgeW91ciBsZXZlbCBvZiB6b29tIGFuZCBhbGlnbiB0aGUgbWFwIGluIHlvdXIgZGVzaXJlZCBsb2NhdGlvbi4gVGhlbiB1bmRlciBfTGF5ZXJzXyZuYnNwOyBzZWN0aW9uLCBjbGljayAiTG9jayBMYXllcnMiIHRvIGtlZXAgdGhlIG1hcCBmcmFtZSBmcm9tIGJlaW5nIGFsdGVyZWQuIFlvdSBjYW4gYWx3YXlzIHJldHVybiB0byB0aGlzIGxheWVyIGFuZCB1bmxvY2sgaXQgaWYgeW91IG5lZWQgdG8gbWFrZSBjaGFuZ2VzLg0KDQpOZXh0IHJldHVybiB0byB0aGUgcHJvamVjdCBhbmQgdHVybiBvZmYgdGhlIE1haW4gTWFwLCB0aGVuIHR1cm4gb24gdGhlIEluc2V0IE1hcCBhbmQgcmV0dXJuIHRvIHRoZSBsYXlvdXQgYW5kIGFkZCBhbm90aGVyIG1hcC4gQmVjYXVzZSB5b3UgaGF2ZSB0aGUgaW5zZXQgZ3JvdXAgc2VsZWN0ZWQgYW5kIHRoZSBtYWluIG1hcCBncm91cCBoaWRkZW4sIHRoZSBhZGRpdGlvbmFsIG1hcCBmcmFtZSB3aWxsIGNvbnRhaW4gdGhlIGluc2V0IGluZm9ybWF0aW9uLiBSZW1lbWJlciB0byB0aGluayBhYm91dCB3aGVyZSB5b3Ugd2FudCB0aGUgaW5zZXQgdG8gYmUgbG9jYXRlZCBiZWZvcmUgeW91IGRyYXcgaXQgb24gdGhlIGxheW91dC4gV2hpbGUgeW91IGNhbiBjaGFuZ2UgdGhpcyBhdCBhbnl0aW1lLCB5b3Ugc2hvdWxkIGFsd2F5cyBoYXZlIGEgcGxhbm5lZCBtYXAgZGVzaWduLg0KDQo8cCBhbGlnbj0iY2VudGVyIj48ZGl2IGNsYXNzPSJ6b29tIj48aW1nIHNyYz0gIkltYWdlcy9xZ2lzLWxheW91dC1pbnNldC1tYXAucG5nIiBhbHQ9IkxheW91dCB3aXRoIEluc2V0IE1hcCIgc3R5bGU9IndpZHRoOjEwMCUiPjwvZGl2PjwvcD4NCg0KRmluYWxpemUgeW91ciBtYXAgYnkgYWRkaW5nIGFsbCBvZiB0aGUgbmVjZXNzYXJ5IG1hcCBlbGVtZW50cyAodGl0bGUsIGxlZ2VuZCwgbm9ydGggYXJyb3csIHNjYWxlIGJhciwgbmFtZSBhbmQgZGF0ZSkgYW5kIGFsdGVyaW5nIHRoZSBzeW1ib2xvZ3kgb2YgdGhlIGh1cnJpY2FuZSBkYXRhc2V0IHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbXBvcnRhbnQgZGF0YS4gUmVtZW1iZXIgdG8gcmVuYW1pbmcgaXRlbXMgaW4gdGhlIFRhYmxlIG9mIENvbnRlbnRzIHdpbGwgcmVuYW1lIHRoZW0gaW4gdGhlIGxlZ2VuZCBidXQgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgaW4gdGhlIGl0ZW0gcHJvcGVydGllcy4gQWx0ZXJuYXRpdmVseSwgaW4gdGhlIGl0ZW0gcHJvcGVydGllcyBmb3IgdGhlIGxlZ2VuZCB5b3UgY2FuIHNlbGVjdCBhbnkgb2JqZWN0IGFuZCBjbGljayB0aGUgRWRpdCBidXR0b24gPGltZyBzcmM9ICJJbWFnZXMvcWdpcy1lZGl0LWl0ZW0tcHJvcGVydGllcy1idXR0b24uanBnIiBhbHQ9IkFkZCBHcm91cHMiIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCI+IHRvIHJlbmFtZSB0aGVtLg0KDQo8YmlnPjxiPlF1ZXN0aW9uIE5vLiAzPC9iPjwvYmlnPg0KPGJsb2NrcXVvdGU+DQpIb3cgbWFueSB0b3RhbCBpbXBhY3RlZCBjb3VudGllcyBhcmUgaW5jbHVkZWQgaW4gdGhlIG5ldyBkYXRhc2V0Pw0KPC9ibG9ja3F1b3RlPg0KDQo8L2RldGFpbHM+DQo8aHI+PC9ocj4NCg0KPGRldGFpbHM+PHN1bW1hcnk+PGJpZz5WaWV3IGRpcmVjdGlvbnMgaW4gPGI+IFtSXXtzdHlsZT0iY29sb3I6IzY0OTVFRCJ9IDwvYj48L3NwYW4+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpCbGFoLi4uYmxhaC4uLmJsYWguLi4NCg0KPGJpZz48Yj5RdWVzdGlvbiBOby4gMzwvYj48L2JpZz4NCjxibG9ja3F1b3RlPg0KX0luc2VydCBUZXh0IEhlcmVfDQo8L2Jsb2NrcXVvdGU+DQoNCjwvZGV0YWlscz4NCg0KIyMgU3RlcCBGb3VyOiBZb3VyIFR1cm4NCg0KQWZ0ZXIgcHJvdmlkaW5nIHRoZSBpbml0aWFsIG1hcCB0byBGRU1BLCB0aGUgRGVwdXR5IEFzc29jaWF0ZSBBZG1pbmlzdHJhdG9yIGZvciB0aGUgT2ZmaWNlIG9mIFJlc3BvbnNlIGFuZCBSZWNvdmVyeSBoYXMgYXNrZWQgaWYgeW91IGNvdWxkIGFkZCBzb21lIGFkZGl0aW9uYWwgZGF0YS4gU3BlY2lmaWNhbGx5LCB0aGV5IGFyZSBpbnRlcmVzdGVkIGluIGNpdGllcyB3aXRoIGEgcG9wdWxhdGlvbiBvZiBncmVhdGVyIHRoYW4gMzAwLDAwMCBzbyB0aGV5IGFyZSBhYmxlIHRvIHNpdHVhdGUgcmVzcG9uc2UgdGVhbXMgaW4gcHJveGltaXR5IHRvIHRoZSBtb3N0IHBlb3BsZS4NCg0KPGRldGFpbHM+PHN1bW1hcnk+PGJpZz5WaWV3IGRpcmVjdGlvbnMgaW4gPGI+IFtBcmNHSVMgUHJvXXtzdHlsZT0iY29sb3I6I2ZmNDUwMCJ9IDwvYj48L3NwYW4+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpJZiB5b3UgZGlkIG5vdCBwcmV2aW91c2x5IGRvd25sb2FkIHRoZSBbY2l0aWVzIGRhdGFdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc21nZW50cnkvR0lTMS1FeGVyY2lzZS00L3Jhdy9tYWluL0RhdGEvVVNfQ2l0aWVzXzEwMGsuemlwKSBmcm9tIHRoZSBHaXRIdWIgRXhlcmNpc2UgUGFnZSBwbGVhc2UgZG93bmxvYWQgdGhlIGRhdGEgYW5kIHVuemlwIGl0IGluIHlvdXIgcHJvamVjdCBmb2xkZXIuIFdpdGggdGhhdCBkYXRhIGF2YWlsYWJsZSwgYWRkIHRoZSBVU19DaXRpZXNfMTAway5zaHAgdG8geW91ciBwcmltYXJ5IG1hcCAobm90IHRoZSBpbnNldCBtYXApLiBSZXBlYXRpbmcgdGhlIHN0ZXBzIHRvICoqY2xpcCoqIGZyb20gW1N0ZXAgMV0oaHR0cHM6Ly9jaHJpc21nZW50cnkuZ2l0aHViLmlvL0dJUzEtRXhlcmNpc2UtNC8jMTFfU3RlcF9PbmU6X1RoZV9EYXRhKSBzZWxlY3QgdGhlIGNpdGllcyBhcyB5b3VyIF9JbnB1dCBGZWF0dXJlXywgdGhlIGh1cnJpY2FuZSBidWZmZXIgYXMgdGhlIF9DbGlwIEZlYXR1cmVfLCBhbmQgYmUgc3VyZSB0byBzYXZlIHRoZSBuZXcgZGF0YXNldCB0byB5b3VyIHByb2plY3QgZm9sZGVyIHdpdGggLnNocCB0byBjcmVhdGUgYSBzaGFwZWZpbGUuIFlvdSBjYW4gbm93IHJlbW92ZSB0aGUgVVMgQ2l0aWVzIGZyb20gdGhlIHByb2plY3QgYnV0IGtlZXAgeW91ciBjbGlwcGVkIGNpdGllcy4NCg0KV2hpbGUgeW91IHdpbGwgbGVhdmUgYWxsIG9mIHRoZSBjbGlwcGVkIGNpdGllcyBvbiB0aGUgbWFwLCB5b3Ugd2lsbCBub3cgY3JlYXRlIGEgX0xhYmVsIENsYXNzXyB0byBvbmx5IGNyZWF0ZSBsYWJlbHMgZm9yIGNpdGllcyB3aXRoIGEgcG9wdWxhdGlvbiBncmVhdGVyIHRoYW4gMzAwLDAwMC4gVG8gYmVnaW4sIHJpZ2h0LWNsaWNrIG9uIHlvdXIgbmV3IGNsaXBwZWQgY2l0aWVzIGRhdGFzZXQgYW5kIHNlbGVjdCAiTGFiZWxpbmcgUHJvcGVydGllcy4uLiIgPGltZyBzcmM9ICJJbWFnZXMvYXJjZ2lzLWxhYmVsaW5nLXByb3BlcnRpZXMuanBnIiBhbHQ9IkxhYmVsaW5nIFByb3BlcnRpZXMiIHdpZHRoPSIxNTAiIGhlaWdodD0iMjAiPiBmcm9tIHRoZSBvcHRpb25zLg0KDQpVbmRlciB0aGUgIkNsYXNzIiBvcHRpb24gaW4gdGhlIExhYmVsIENsYXNzIHdpbmRvdyBzZWxlY3QgKipTUUwqKiBmcm9tIHRoZSB0aHJlZSBvcHRpb25zLiBOZXh0IHNlbGVjdCBfTmV3IGV4cHJlc3Npb25fJm5ic3A7IDxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy1uZXctZXhwcmVzc2lvbi1sYWJlbHMuanBnIiBhbHQ9IkxhYmVsaW5nIFNRTCIgd2lkdGg9IjExNSIgaGVpZ2h0PSIyMCI+IGFuZCBzZWxlY3QgdGhlIGZvbGxvd2luZyBvcHRpb25zOg0KDQo8cCBhbGlnbj0iY2VudGVyIj5XaGVyZSZlbXNwOyoqUE9QVUxBVElPTioqJmVtc3A7KippcyBncmVhdGVyIHRoYW4qKiZlbXNwOyoqMzAwLDAwMCoqPC9wPg0KDQo8cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0gIkltYWdlcy9hcmNnaXMtbGFiZWxpbmctc3FsLnBuZyIgYWx0PSJTUUwgT3B0aW9ucyBmb3IgTGFiZWxpbmciIHN0eWxlPSJ3aWR0aDo1MCUiPjwvcD4NCg0KV2hlbiBjb21wbGV0ZSwgY2xpY2sgKipBcHBseSoqIGF0IHRoZSBib3R0b20gb2YgdGhlIHdpbmRvdy4gVXNlIHRoZSBvcHRpb25zIG9uIHRoZSBfTGFiZWxpbmcgVGFiXyBmb3IgdGhlIGRhdGFzZXQgdG8gYWRqdXN0IHRoZSBsYWJlbCBmaWVsZCB0byBOQU1FLCBjaGFuZ2UgdGhlIGZvbnQgb3Igc2l6ZSBvZiB0aGUgdGV4dCwgYW5kIGNsaWNrIHRoZSAqKkxhYmVsKiogYnV0dG9uIG9uIHRoZSBsZWZ0IG9mIHRoZSB0YWIuDQoNCjxwIGFsaWduPSJjZW50ZXIiPjxkaXYgY2xhc3M9Inpvb20iPjxpbWcgc3JjPSAiSW1hZ2VzL2FyY2dpcy1sYWJlbGluZy10YWIuanBnIiBhbHQ9IkxhYmVsaW5nIE9wdGlvbnMiIHN0eWxlPSJ3aWR0aDoxMDAlIj48L2Rpdj48L3A+DQoNCjxiaWc+PGI+UXVlc3Rpb24gTm8uIDQ8L2I+PC9iaWc+DQo8YmxvY2txdW90ZT4NCldoYXQgbGFiZWxlZCBjaXRpZXMgYXJlIHRoZSBmdXJ0aGVzdCBOb3J0aCwgU291dGgsIEVhc3QsIGFuZCBXZXN0Pw0KPC9ibG9ja3F1b3RlPg0KDQo8L2RldGFpbHM+DQo8aHI+PC9ocj4NCg0KPGRldGFpbHM+PHN1bW1hcnk+PGJpZz5WaWV3IGRpcmVjdGlvbnMgaW4gPGI+IFtRR0lTXXtzdHlsZT0iY29sb3I6IzAwNjQwMCJ9IDwvYj48L3NwYW4+PC9iaWc+PC9zdW1tYXJ5Pg0KDQpJZiB5b3UgZGlkIG5vdCBwcmV2aW91c2x5IGRvd25sb2FkIHRoZSBbY2l0aWVzIGRhdGFdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc21nZW50cnkvR0lTMS1FeGVyY2lzZS00L3Jhdy9tYWluL0RhdGEvVVNfQ2l0aWVzXzEwMGsuemlwKSBmcm9tIHRoZSBHaXRIdWIgRXhlcmNpc2UgUGFnZSBwbGVhc2UgZG93bmxvYWQgdGhlIGRhdGEgYW5kIHVuemlwIGl0IGluIHlvdXIgcHJvamVjdCBmb2xkZXIuIFdpdGggdGhhdCBkYXRhIGF2YWlsYWJsZSwgYWRkIHRoZSBVU19DaXRpZXNfMTAway5zaHAgdG8geW91ciBwcmltYXJ5IG1hcCAobm90IHRoZSBpbnNldCBtYXApLiBSZXBlYXRpbmcgdGhlIHN0ZXBzIHRvICoqY2xpcCoqIGZyb20gW1N0ZXAgMV0oaHR0cHM6Ly9jaHJpc21nZW50cnkuZ2l0aHViLmlvL0dJUzEtRXhlcmNpc2UtNC8jMTFfU3RlcF9PbmU6X1RoZV9EYXRhKSBzZWxlY3QgdGhlIGNpdGllcyBhcyB5b3VyIF9JbnB1dCBMYXllcl8sIHRoZSBodXJyaWNhbmUgYnVmZmVyIGFzIHRoZSBfT3ZlcmxheSBMYXllcl8sIGFuZCBiZSBzdXJlIHRvIHNhdmUgdGhlIG5ldyBkYXRhc2V0IHRvIHlvdXIgcHJvamVjdCBmb2xkZXIgaW4gdGhlIF9DbGlwcGVkXyZuYnNwOyBvcHRpb24uIFlvdSBjYW4gbm93IHJlbW92ZSB0aGUgVVMgQ2l0aWVzIGZyb20gdGhlIHByb2plY3QgYnV0IGtlZXAgeW91ciBjbGlwcGVkIGNpdGllcy4NCg0KV2hpbGUgeW91IHdpbGwgbGVhdmUgYWxsIG9mIHRoZSBjbGlwcGVkIGNpdGllcyBvbiB0aGUgbWFwLCB5b3Ugd2lsbCBub3cgY3JlYXRlIGEgTGFiZWwgQ2xhc3MgdG8gb25seSBjcmVhdGUgbGFiZWxzIGZvciBjaXRpZXMgd2l0aCBhIHBvcHVsYXRpb24gZ3JlYXRlciB0aGFuIDMwMCwwMDAuIFRvIGJlZ2luLCByaWdodC9DUlRMLWNsaWNrIG9uIHlvdXIgbmV3IGNsaXBwZWQgY2l0aWVzIGRhdGFzZXQgYW5kIHNlbGVjdCDigJxQcm9wZXJ0aWVz4oCdLiBVbmRlciB0aGUgKipMYWJlbHMqKiB0YWIgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgbmV3IHdpbmRvdywgc2VsZWN0IF9SdWxlLWJhc2VkIExhYmVsaW5nXyZuYnNwOyBmcm9tIHRoZSBkcm9wLWRvd24gbWVudSBhdCB0aGUgdG9wIG9mIHRoZSB3aW5kb3cuIE5leHQsIGNsaWNrIHRoZSA8Yj5bR3JlZW4gK117c3R5bGU9ImNvbG9yOiMwMDY0MDAifTwvYj4gYXQgdGhlIGJvdHRvbSB0byBhZGQgYSBuZXcgcnVsZS4gUHJvdmlkZSB0aGUgZm9sbG93aW5nIGlucHV0cyBhbmQgY2xpY2sgT0sNCg0KLSBfRGVzY3JpcHRpb25fID0gR2l2ZSB5b3VyIHJ1bGUgYSBuYW1lDQotIF9GaWx0ZXJfID0gVHlwZSB0aGUgZm9sbG93aW5nOiBgYGAgIlBPUFVMQVRJT04iID4gMzAwMDAwYGBgDQotIF9MYWJlbHNfID0gQ2hlY2sgdGhpcyBib3gNCi0gX1ZhbHVlXyA9IE5BTUUNCi0gX1RleHQsIEZvcm1hdHRpbmcsIEJ1ZmZlciwgTWFzaywgZXRjLl8gPSBDdXN0b21pemUgYXMgbmVjZXNzYXJ5IGZvciB5b3VyIHByZWZlcnJlZCBzdHlsZQ0KDQo8cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0gIkltYWdlcy9xZ2lzLXJ1bGUtYmFzZWQtbGFiZWxzLnBuZyIgYWx0PSJSdWxlLWJhc2VkIE9wdGlvbnMgZm9yIExhYmVsaW5nIiBzdHlsZT0id2lkdGg6MTAwJSI+PC9wPg0KDQpGaW5hbGx5LCBjbGljayBPSyBvbiB0aGUgbGF5ZXIgcHJvcGVydGllcyB3aW5kb3cuIFlvdSB3aWxsIG5lZWQgdG8gcmV0dXJuIHRvIHlvdXIgbWFpbiBtYXAgaW4gdGhlIGxheW91dCBhbmQgdW5jaGVjayB0aGUgYm94IGZvciBsb2NrZWQgdG8gdXBkYXRlIHRoZSBtYXAgd2l0aCB0aGlzIG5ldyBpbmZvcm1hdGlvbi4NCg0KPGJpZz48Yj5RdWVzdGlvbiBOby4gNDwvYj48L2JpZz4NCjxibG9ja3F1b3RlPg0KV2hhdCBsYWJlbGVkIGNpdGllcyBhcmUgdGhlIGZ1cnRoZXN0IE5vcnRoLCBTb3V0aCwgRWFzdCwgYW5kIFdlc3Q/DQo8L2Jsb2NrcXVvdGU+DQoNCjwvZGV0YWlscz4NCjxocj48L2hyPg0KDQo8ZGV0YWlscz48c3VtbWFyeT48YmlnPlZpZXcgZGlyZWN0aW9ucyBpbiA8Yj4gW1Jde3N0eWxlPSJjb2xvcjojNjQ5NUVEIn0gPC9iPjwvc3Bhbj48L2JpZz48L3N1bW1hcnk+DQoNCkJsYWguLi5ibGFoLi4uYmxhaC4uLg0KDQo8YmlnPjxiPlF1ZXN0aW9uIE5vLiA0PC9iPjwvYmlnPg0KPGJsb2NrcXVvdGU+DQpfSW5zZXJ0IFRleHQgSGVyZV8NCjwvYmxvY2txdW90ZT4NCg0KPC9kZXRhaWxzPg0KDQojIFRoZSBXcml0ZS1VcA0KDQpJbiB0aGUgcmVwb3J0IHlvdSBwcm92aWRlIHRvIEZFTUEgcGxlYXNlIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoNCg0KLSBUb3RhbCBwb3B1bGF0aW9uIG9mIHRoZSBpbXBhY3RlZCBjb3VudGllcw0KLSBUb3RhbCBudW1iZXIgb2YgbGFyZ2UgY2l0aWVzIChhbGwgaW4gdGhlIGNsaXBwZWQgZGF0YXNldCkNCi0gV2hpY2ggY2l0aWVzIGFib3ZlIDMwMCwwMDAgcGVvcGxlIHdvdWxkIG5lZWQgcmVzcG9uc2UgdGVhbXMNCiAgLSBCYXNlZCBvbiB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZXNlLCB3b3VsZCBpdCBiZSBwb3NzaWJsZSBmb3Igb25lIHJlc3BvbnNlIHRlYW0gdG8gY292ZXIgbXVsdGlwbGUgbGFyZ2UgY2l0aWVzPw0KDQpXaGVuIGNvbXBsZXRlLCBzZW5kIGEgbGluayB0byB5b3VyIF9Db2xhYiBOb3RlYm9va18gb3Igd29yZCBkb2N1bWVudCB3aXRoIGFuc3dlcnMgdG8gUXVlc3Rpb25zIDEtNCBhbmQgeW91ciBjb21wbGV0ZWQgbWFwIHZpYSBlbWFpbC4=